2011年04月29日

[Android] SDカードを示すディレクトリ

先日、OreillyのLinuxハンドブックという本を読んでいて、printenvというコマンドを記憶しました。
その後、Androidアプリの開発を行っていて、「adb shell」でシェルを使うことがあったので、そのときたまたま覚えていたprintenvを使ってみました。
そんなに多くはないけれど、環境変数がずらずらっと表示されました。
その中にひとつ気になる環境変数が。
それが$EXTERNAL_STORAGEです。
初めてその環境変数に気づいたときは、Desireで実行していました。
パスは /mnt/sdcard/ を示していました。

以前、仕事でAndroidアプリの開発を行っていたとき、SMT-i9100(au の タブレット端末)のSDカードのディレクトリを取得するのに困ったことを思い出しました。
SMT-i9100は(というかSamsung製端末?)は、SDカードのパスがちょっと特殊なのです。
通常、SDカードのパスはEnvironment.getExternalStorageDirectory()で取得します。
Desireで実行すればもちろん「/mnt/sdcard/」を返してくれます。「/mnt/sdcard/」はSDカードのルートディレクトリ(っていうの?)を指します。

ところが、SMT-i9100で同じように実行すると、そうはいかないのです。
SMT-i9100のSDカードは「/mnt/sdcard/external_sd/」にあります。
ところが上記APIでパスを取得しようとすると、「/mnt/sdcard/」を返します。
これはSMT-i9100の内部メモリになります。
ファイルの読み書きは普通にできますので、アプリが単体で動く場合には問題ないのですが、物理的なSDカードにアクセスすることを前提としたアプリでは困ることがあります。

そこでこの環境変数です。
SMT-i9100でこの変数の中身が一体何を指しているか。
確認してみたところ、なんと「/mnt/sdcard/external_sd/」が設定されていました。
もし、これがどのAndroid端末も共通の仕様であれば、SDカードのパスを取得するのに困ることがなくなります。
すごい大発見だ、と思ったのですが、一人で確認するのはちょっと難しそうです。
一応、確認用のアプリを作ったので、もし確認いただける方がいらっしゃいましたら、ご協力ください。

・Environment.getExternalStorageDirectory()と$EXTERNAL_STORAGEの値を表示するアプリ
ExternalStorageSample.apk
(ソースはこちら→ExternalStorageSample.zip

現状、以下の端末は$EXTERNAL_STORAGEが正しくSDカードのパスを指すことが分かっています。
・HTC Desire
・SMT-i9100
・Galaxy S

MotorolaのXOOMに関してはSDカードがまだ使用できないせいか、どちらも「/mnt/sdcard/」を指していました。
こちらについてはアップデートを待ってもう一度確認してみたい(させてもらいたい)と思っています。
※6/24追記 コメントで情報いただきまして、アップデートしてAndroid3.1になったXOOM(SDカードが使える)でも「/mng/sdcard/」を指しているとのこと。
環境変数に正しいSDカードへのパスが格納されているんじゃないか、という推測は外れてしまいました。
きちんとしたSDカードへのパスを取得したい人はどうしたら良いのでしょうかね…。


ちなみにアプリから環境変数を取得するには以下のコードで取得できます。
System.getenv("EXTERNAL_STORAGE");
↑は$EXTERNAL_STORAGEを取得するときのコードですので、別の環境変数を取得する場合は適宜変数名を変えてください。

device.png
※こちらは同僚のGalaxy Sで試させてもらったときのスクリーンショット。
タグ:android
posted by t2low at 02:22| Android