本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Android 4.3あたりから外部SDのパスが変わった? その2

前回の内容でパス決めうちはちょっと・・・。ということで終わっていましたが、あれからもうすこし悪あがきをしてみました。

「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にマウントされている状態では上記で取得したパスにアクセスすることができません。これは既知の内容となっているかもしれませんが、ご注意下さい。

Android
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました