戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SDカードのパス取得:Environment と 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修正)
※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) を使用します。

// 環境変数から外部SDカードのパスを取得(旧)
String sdcard = System.getenv("EXTERNAL_STORAGE");
GALAXY Sではこれで外部SDカードのパスが取得できる、と色々なサイトでは書かれているのですが GALAXY Tabで実行したところEnvironment#getExternalStorageDirectory() と同じパスが返ってきてしまいました
Android 2.2 のソースコードを見ても内部で同じ事をしているので別のが変えるはずないのですが…。
(日本Androidの会の掲示板参照…自分も確認しました)
GALAXY Tabの仕様なのか、Androidのバージョンアップで変わったのかは分かりません。

で、色々調べたところ外部SDカード用の環境変数が追加されていました。
情報元は(ドメインがfrなのでたぶん)フランスの掲示板です。
書いた当初は日本語のサイトでは見つからなかったのでここを参考にしましたが、最近(2011/12/12)では日本語のサイトでも機種依存のSDカードパスの取得について書かれているところも出てきましたね。

Sumsung GALAXY Tab SC-01C(Android 2.3.3 バージョンアップ済)で確認
// 環境変数から外部SDカードのパスを取得(新)
String sdcard = System.getenv("EXTERNAL_STORAGE2");
ぱっと見、違いはわかりませんが EXTERNAL_STORAGE2 と 2 が追加されています。
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()』の記事を参考にするのも有りです。

もし別のパスが設定されている機種を見つけたらご報告いただけると嬉しいです。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。