- Date: Wed 27 07 2011
- Category: Android
- Response: Comment 0 Trackback 0
SDカードのパス取得:Environment と System.getenv
------------------------------------------------------------
(2012/11/27 追記)
この記事では外部ストレージのパスは取得しきれませんでした。
最新の『外部ストレージのパスを取得する(Android 2.2~?)』を参照してください。
------------------------------------------------------------
SDカードのパスは Android API を使って取得することが出来ます。
機種によってはパスが変わるので文字列で指定するのは辞めて下さい。
と、パスが変わるだけなら良かったのですが、実は機種によって取得する方法自体が違うという問題があります。
以降の記事は下記のサイトを参考、追記しています。
three hundred and seventy-five 「SDカードへのパスの取得方法 」
理ろぐ 「Galaxy SとGalaxy Tabのカメラ画像とかが保存される場所意識してますか?」
取得する方法が違うのは、内部SDカードと外部SDカードの2つを持っているサムスン製(GALAXY Tab他)等の一部の携帯です。
※今後これが主流になってくるかもしれませんが、パスがメーカー依存なのは勘弁してほしい…
Sumsung GALAXY Tab SC-01C
Sumsung GALAXY SⅡ SC-02C
Sumsung GALAXY Note SC-05D
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/external_sd
MOTOROLA Photon ISW11M
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard-ext
HTC J ISW13HT
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/ext_sd
(追記:2012/11/27修正)
※GALAXY Tab SC-02D(Android 3.2) は内部と外部にわかれていませんでした。
SDカードのパスは /mnt/sdcard です
GALAXY Tab 7.0 Plus SC-02D
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/extStorages
これらの携帯は先に述べた方法だと内部SDカードのパスを取得してしまい、ユーザーが挿した(外部)SDカードのパスは取得できません。
Android APIには取得する術がないので環境変数からパスを取得します。
環境変数を呼び出すには System#getenv(String name) を使用します。
Android 2.2 のソースコードを見ても内部で同じ事をしているので別のが変えるはずないのですが…。
(日本Androidの会の掲示板参照…自分も確認しました)
GALAXY Tabの仕様なのか、Androidのバージョンアップで変わったのかは分かりません。
で、色々調べたところ外部SDカード用の環境変数が追加されていました。
情報元は(ドメインがfrなのでたぶん)フランスの掲示板です。
書いた当初は日本語のサイトでは見つからなかったのでここを参考にしましたが、最近(2011/12/12)では日本語のサイトでも機種依存のSDカードパスの取得について書かれているところも出てきましたね。
Sumsung GALAXY Tab SC-01C(Android 2.3.3 バージョンアップ済)で確認
MOTOROLA Photon ISW11M の場合は EXTERNAL_ALT_STORAGE でした。
環境変数が存在しなければ null を返却します。
それを利用して、この問題は下記のようなメソッドを作って対応できそうです。
パスの違う機種が出たらその都度追加する形で。
現在の機種がバージョンアップで変更されることもあるかもしれません…
HTCの対応がなかったので Palesky 普通の日記。 - HTC J を参考に若干修正しました。
if で深くなるの好きじゃないのでところどころで return してます。
ちなみに、機種の環境変数を確認したいのであれば、携帯とPCをUSBケーブルで繋いでスタートメニューからコマンドプロンプトを立ち上げます。
コマンドプロンプトが起動したら adb shell と実行して、次に printenv と入力すれば携帯に設定されている環境変数が見れます。
アプリを作って確認したいのであれば『環境変数の一覧を取得してみる:System.getenv()』の記事を参考にするのも有りです。
もし別のパスが設定されている機種を見つけたらご報告いただけると嬉しいです。
(2012/11/27 追記)
この記事では外部ストレージのパスは取得しきれませんでした。
最新の『外部ストレージのパスを取得する(Android 2.2~?)』を参照してください。
------------------------------------------------------------
SDカードのパスは Android API を使って取得することが出来ます。
// Environmentクラスから取得
File file = Environment.getExternalStorageDirectory();
String sdcard = file.getPath();
// 文字列で指定するのはダメ絶対
// String sdcard = "/sdcard";
機種によってはパスが変わるので文字列で指定するのは辞めて下さい。
と、パスが変わるだけなら良かったのですが、実は機種によって取得する方法自体が違うという問題があります。
以降の記事は下記のサイトを参考、追記しています。
three hundred and seventy-five 「SDカードへのパスの取得方法 」
理ろぐ 「Galaxy SとGalaxy Tabのカメラ画像とかが保存される場所意識してますか?」
取得する方法が違うのは、内部SDカードと外部SDカードの2つを持っているサムスン製(GALAXY Tab他)等の一部の携帯です。
※今後これが主流になってくるかもしれませんが、パスがメーカー依存なのは勘弁してほしい…
Sumsung GALAXY Tab SC-01C
Sumsung GALAXY SⅡ SC-02C
Sumsung GALAXY Note SC-05D
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/external_sd
MOTOROLA Photon ISW11M
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard-ext
HTC J ISW13HT
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/ext_sd
(追記:2012/11/27修正)
SDカードのパスは /mnt/sdcard です
GALAXY Tab 7.0 Plus SC-02D
・データフォルダ /data
・内部SDカード /mnt/sdcard
・外部SDカード /mnt/sdcard/extStorages
これらの携帯は先に述べた方法だと内部SDカードのパスを取得してしまい、ユーザーが挿した(外部)SDカードのパスは取得できません。
Android APIには取得する術がないので環境変数からパスを取得します。
環境変数を呼び出すには System#getenv(String name) を使用します。
// 環境変数から外部SDカードのパスを取得(旧)GALAXY Sではこれで外部SDカードのパスが取得できる、と色々なサイトでは書かれているのですが GALAXY Tabで実行したところEnvironment#getExternalStorageDirectory() と同じパスが返ってきてしまいました。
String sdcard = System.getenv("EXTERNAL_STORAGE");
Android 2.2 のソースコードを見ても内部で同じ事をしているので別のが変えるはずないのですが…。
(日本Androidの会の掲示板参照…自分も確認しました)
GALAXY Tabの仕様なのか、Androidのバージョンアップで変わったのかは分かりません。
で、色々調べたところ外部SDカード用の環境変数が追加されていました。
情報元は(ドメインがfrなのでたぶん)フランスの掲示板です。
書いた当初は日本語のサイトでは見つからなかったのでここを参考にしましたが、最近(2011/12/12)では日本語のサイトでも機種依存のSDカードパスの取得について書かれているところも出てきましたね。
Sumsung GALAXY Tab SC-01C(Android 2.3.3 バージョンアップ済)で確認
// 環境変数から外部SDカードのパスを取得(新)ぱっと見、違いはわかりませんが EXTERNAL_STORAGE2 と 2 が追加されています。
String sdcard = System.getenv("EXTERNAL_STORAGE2");
MOTOROLA Photon ISW11M の場合は EXTERNAL_ALT_STORAGE でした。
環境変数が存在しなければ null を返却します。
それを利用して、この問題は下記のようなメソッドを作って対応できそうです。
パスの違う機種が出たらその都度追加する形で。
現在の機種がバージョンアップで変更されることもあるかもしれません…
/**
* 外部ストレージ(SDカード)のパスを取得する。
*
* @return 外部ストレージのパス
*/
public static String getExternalStoragePath() {
String path;
// MOTOROLA 対応
path = System.getenv("EXTERNAL_ALT_STORAGE");
if (path != null)
return path;
// Sumsung 対応
path = System.getenv("EXTERNAL_STORAGE2");
if (path != null)
return path;
// 旧 Sumsung + 標準 対応
path = System.getenv("EXTERNAL_STORAGE");
if (path == null)
path = Environment.getExternalStorageDirectory().getPath();
// HTC 対応
File file = new File(path + "/ext_sd");
if (file.exists())
path = file.getPath();
// その他機種
return path;
}
HTCの対応がなかったので Palesky 普通の日記。 - HTC J を参考に若干修正しました。
if で深くなるの好きじゃないのでところどころで return してます。
ちなみに、機種の環境変数を確認したいのであれば、携帯とPCをUSBケーブルで繋いでスタートメニューからコマンドプロンプトを立ち上げます。
コマンドプロンプトが起動したら adb shell と実行して、次に printenv と入力すれば携帯に設定されている環境変数が見れます。
アプリを作って確認したいのであれば『環境変数の一覧を取得してみる:System.getenv()』の記事を参考にするのも有りです。
もし別のパスが設定されている機種を見つけたらご報告いただけると嬉しいです。
スポンサーサイト