2010年8月31日火曜日

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

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

"/sdcard/hoge.png"

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

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

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


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

  1. // get file state  
  2. String status   = Environment.getExternalStorageState();  
  3. // get file path  
  4. String filepath = Environment.getExternalStorageDirectory().toString() + "/myapp/hoge.png";  
  5.   
  6. if (!status.equals(Environment.MEDIA_MOUNTED)) {  
  7.   // media is not mounted  
  8. else  if (!(new File(filepath)).exists()) {  
  9.   // file does not exists  
  10. }  




ここで注意ですが、

この 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 件のコメント:

コメントを投稿