ファイルを指定するときに
"/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 件のコメント:
コメントを投稿