2010年8月31日火曜日

Android 外部メディア (外部ストレージ, SD card) の場所を取得する

Android の外部メディア( = ほぼ SDCard のこと)にある
ファイルを指定するときに

"/sdcard/hoge.png"

とか書いてはいけません!
端末によってはパスが /sdcard/ じゃなかったりするからです。
(確かどっかのタブレットかなんかがそうだった)
それに、PCにマウントされてたり、端末に入ってなかったり
したらアクセスできません。

なので、ハードコーディングはやめましょう。

外部メディアにアクセスできるかどうかは getExternalStorageState()
でわかります。
#でもここで、「注:この呼び出しは、複数のボリュームをサポートしていないため、廃止する必要があります。」って書いてあるけど代替方法が載ってないのよね。。。


外部メディアのパスは Environment の getExternalStorageDirectory() を使えば OK です。


// get file state
String status = Environment.getExternalStorageState();
// get file path
String filepath = Environment.getExternalStorageDirectory().toString() + "/myapp/hoge.png";

if (!status.equals(Environment.MEDIA_MOUNTED)) {
// media is not mounted
} else if (!(new File(filepath)).exists()) {
// file does not exists
}





ここで注意ですが、

この top-level directory (= "/sdcard/" とかの直下)を直接
使うのは避けましょう。
なぜなら、ユーザの root namespace を汚染してしまうからです。

つまり、"/sdcard/" の下に直接ファイルを置いてはいけません。
これを避ける方法としていくつかあります。

1. Context.getExternalFilesDir(String)

  これは、API Level 8 から使えるようになった関数で、
  アプリ用のファイルを置くためのディレクトリを返してくれます。
  このディレクトリ内に置いたファイルはアプリのアンインストール時に
  削除されます。
  通常、メディアとしてユーザーに表示されませんが、セキュリティが
  かかっているわけではないので、他のアプリからこのディレクトリに
  読み書きすることは可能です。

2. getExternalStoragePublicDirectory (String type)

  これも、API Level 8 から使えるようになった関数で、
  public なディレクトリを返してくれます。
  例えば、

  File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

  とすると、カメラで撮った写真のあるディレクトリを取得できます。

0 件のコメント:

コメントを投稿