前回の内容でパス決めうちはちょっと・・・。ということで終わっていましたが、あれからもうすこし悪あがきをしてみました。
「vold.fstab の設定がダメならば環境変数のほうではどうだろうか?」ということで Galaxy S4 4.4.2 のもので環境変数を表示させてみました。
一部抜粋ですがこんな結果になりました。
Galaxy S4 (4.4.2)の場合
framework/stayrotation.jar:/system/framework/smartfaceservice.jar:/system/framew ork/commonimsinterface.jar:/system/framework/org.codeaurora.Performance.jar EMULATED_STORAGE_SOURCE=/mnt/shell/emulated ANDROID_SOCKET_adbd=11 EMULATED_STORAGE_TARGET=/storage/emulated ANDROID_STORAGE=/storage MKSH=/system/bin/sh EXTERNAL_STORAGE=/storage/emulated/legacy RANDOM=22529 ASEC_MOUNTPOINT=/mnt/asec SECONDARY_STORAGE=/storage/extSdCard USER=shell HOME=/data
見事に extSdCard のマウントポイント示す環境変数が存在していました。これを使えば少なくとも S4 ではパスのハードコードを避けられそうです。
従来も環境変数で外部SDのパスを取得する方法があったようですが、それは EXTERNAL_STORAGE の参照を取得するものがほとんどで、これだと期待した動きにはなりません。ポイントは SECONDARY_STORAGE の環境変数を見にいくことが必要、ということでしょうか。
他の機種では?
手元にある XPERIA Z1 Compact ではどうなっているか確認してみました。
XPERIA Z1 Compact(4.3)の場合
y-msim.jar:/system/framework/com.sonyericsson.uxpres.jar:/system/framework/qcom. fmradio.jar:/system/framework/oem-services.jar:/system/framework/WfdCommon.jar:/ system/framework/qcmediaplayer.jar EMULATED_STORAGE_SOURCE=/mnt/shell/emulated ANDROID_SOCKET_adbd=13 EMULATED_STORAGE_TARGET=/storage/emulated ANDROID_STORAGE=/storage MKSH=/system/bin/sh EXTERNAL_STORAGE=/storage/emulated/legacy LD_PRELOAD=/vendor/lib/libNimsWrap.so EXTERNAL_STORAGE_USB=/storage/removable/usbdisk RANDOM=14748 ASEC_MOUNTPOINT=/mnt/asec SECONDARY_STORAGE=/storage/removable/sdcard1 USER=shell HOME=/data
ICONIA TAB A500 (4.2.2)の場合
ちょっと前のICONIA TAB A500の 4.2.2 へバージョン更新したものがあったのでこれでも確認してみました。
rootを取得状態なので一部参考にならないかも・・・。
PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin LOOP_MOUNTPOINT=/mnt/obb MKSH=/system/bin/sh ANDROID_DATA=/data ANDROID_ROOT=/system EMULATED_STORAGE_TARGET=/storage/emulated ANDROID_CACHE=/cache SHELL=/system/bin/sh ANDROID_STORAGE=/storage ANDROID_SOCKET_adbd=10 USER=root HOME=/data EXTERNAL_STORAGE=/storage/emulated/legacy ANDROID_ASSETS=/system/app TERM=linux RANDOM=22311 ASEC_MOUNTPOINT=/mnt/asec SECONDARY_STORAGE=/storage/sdcard1 ANDROID_PROPERTY_WORKSPACE=9,49152 ANDROID_BOOTLOGO=1
やはり結果が違いました。しかし、SECONDARY_STORAGE という環境変数は存在しており、これが外部SDカードへのマウントポイントとなっていそうです。
対処コード
これらの問題に対応するために、環境変数から外部SDカードのパスを取得するコードを書いてみました。
手元にあったGalaxy S2,S4、XPERIA Z1 Compact,ICONIA TAB A500 で動作確認しています。ただし、ネットの情報をみているとこれだけの環境変数参照では全然ダメらしいですが。
static String getExternalSDcardPath() { String path = null; path = System.getenv( "EXTERNAL_STORAGE2" ); // GalaxyS2(2.3.4) if( path != null ) { return path; } // Android 4.4(S4,XPERIA,etc...) path = System.getenv( "SECONDARY_STORAGE" ); if( path != null ) { return path; } return path; }
GalaxyS2というか Android 2.x系の話だと思いますが、USBでPCと接続の際にPCにマウントされている状態では上記で取得したパスにアクセスすることができません。これは既知の内容となっているかもしれませんが、ご注意下さい。