【Android】仮想端末のファイル書き込み確認手順
FileOutputStream 等で「/data/data/(パッケージ)/files」配下に書き込んだ際に、
「権限ないから見せてあげませーん」を回避する手順
#全てプロンプト上で操作
【案1. run-as】
①仮想端末起動
②[DOS](ユーザディレクトリ)\AppData\Local\Android\Sdk\platform-tools\adb.exe shell
③[DOS]run-as パッケージ名
④[DOS]cd files
【案2. rootで無理やり】
①仮想端末起動
②[DOS](ユーザディレクトリ)\AppData\Local\Android\Sdk\platform-tools\adb.exe shell
③[DOS]generic_x86_64:/ mount -o rw,remount /system
④[DOS]su
⑤[DOS]cd /data/data/(パッケージ)/files
#ぐぐって出てきたものは案1が圧倒的に多かったけど、
#パッケージ名を毎回打つのがだるいので、案2で定着しそう。
ついでに、ファイルをPCに取り出す手順。
①[DOS]cat (取り出すファイル名) > /sdcard/(ファイル名)
※ファイルパスが分かりやすいよう、SDカードにコピーしておく。
②"adb.exe shell" を終了
③adb.exe pull /sdcard/(ファイル名) (ファイル名)
【Android】実機デバッグ用の設定
そろそろAndroid Studioの書籍も少しずつ多くなってきたので、本格的に触ってみようかと。
で、確かEclipse+ADTの時にも苦労した実機デバッグの設定を再度行ったのですが、つまづいたのでメモを残しときます。
基本的な手順は他のブログでも載ってますが、
- Android端末のUSBデバッグを有効にする
- Android Studioに「Google USB Driver」をインストール
- Android端末をPCにUSB接続
- Android Studioの「Android Monitor」の左上に実機名の表示を確認
で完了。
ほとんどの機種の場合、上記だけだとNGだと思います。
デバイスマネージャを覗くと分かると思いますが、3.の接続が失敗しています。
(ドライバのインストールに失敗してます。)
2. でインストールした「Google USB Driver」は
>【Android SDKインストール先】\extras\google\usb_driver
に保存されるようですが、"android_winusb.inf"の中身を見ると・・・
(略)
[Google.NTx86]
;Google Nexus S
(略)
[Google.NTamd64]
;Google Nexus S
(略)
てな感じで、機種ごとに定義してあるので、ココに載ってない端末を用意してもインストールされるわけがありません。
不親切すぎます!
なので、ココに今回接続する端末情報を追加して、このinfファイルをドライバとして更新してあげましょう。
定義情報は、
;Google Nexus One
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02&MI_01
こんな感じで2行あるっぽい。VIDとPIDってのが分かればいいみたいです。
VIDとPIDは、デバイスマネージャの該当項目のプロパティ⇒詳細からハードウェアIDを開いてあげると、
こんな感じで載ってます。
REVってのはいらないみたい。
ウチの子は数年眠ってた「Xperia Acro」ですが、VID=0FCE、PID=615Cみたいです。
[Google.NTx86]
(略)
;Xperia Acro
%SingleAdbInterface% = USB_Install, USB\VID_0FCE&PID_615C
%CompositeAdbInterface% = USB_Install, USB\VID_0FCE&PID_615C&MI_01[Google.NTamd64]
(略)
;Xperia Acro
%SingleAdbInterface% = USB_Install, USB\VID_0FCE&PID_615C
%CompositeAdbInterface% = USB_Install, USB\VID_0FCE&PID_615C&MI_01[USB_Install]
こんな感じ。
忘れずにx86、64の両方に定義してください。
私は片方忘れて30分ほどハマりました。
ただ、Acroなんて何年前の端末だって話です。Android 2.3だし。。
安い白ROMでも買おうかなーと思う今日この頃でした。
【C#】ディレクトリ名を変更する時に気をつけること
ディレクトリ名の変更をする時は、
DirectoryInfo di = new DirectoryInfo(path);
// 変更後ディレクトリ名(フルパス)
di.MoveTo(di.Parent.FullName + "\\" + 変更後ディレクトリ名)
とするようです。
ファイル名を変更するというより、移動するって感じみたいですね。
で、今回困ったのは、
DirectoryInfo parent = new DirectoryInfo(ParentDirPath);
DirectoryInfo child = new DirectoryInfo(childDirPath);
parent.MoveTo(parent.Parent.FullName + "\\" + 変更後親ディレクトリ名);
child.MoveTo(child.Parent.FullName + "\\" + 変更後子ディレクトリ名);
てな感じで、親子ディレクトリ両方更新しようとしたわけですよ。
そしたら、子のディレクトリ名変更しようとした時に、「DirectoryNotFoundException」が発生しちゃいました。
なんでだー?と思ってデバッグで色々見てたら、
child
Exists | true
FullName | 変更前親ディレクトリ\\子ディレクトリ名
となってました。
勝手に更新してくれないんですね。そりゃそうか。
何か術がないかなーと思ったら、DirectoryInfo.Refresh()なんて、如何にもソレっぽいのがありました。
ただ、コレを実行すると、
child
Exists | false
FullName | 変更前親ディレクトリ\\子ディレクトリ名
ってなっちゃいます。
空気読んでパスを更新して欲しいんですがー。
とりあえず、強引に以下で組みました。
string name = child.Name
foreach (DirectoryInfo wk in parent.GetDirectories()) {
if (wk.Name.equals(name)) {
child = wk;
}
}
今は1親1子なのでなんとかなるけど、子供いっぱい出てきたら嫌だなぁ。
とりあえずメモ残し。
Android / iOSのアプリ作りたいなーと思って
両方で動かせないかなーと調べてたら、最近はC#で開発できるみたいですね。
でも結局、半分くらいしか共通化できないなら色々面倒そうだなー。
諦めて王道のADTですかね。
(追記)
も少し調べてたら、ADTって年内で開発・サポート終了するのですね。寝耳に水でした。
いい機会なので、Android Studioってのを触ってみようかと。