web-dev-qa-db-ja.com

`/ storage / emulated / legacy /` vs `/ storage / emulated / 0 /` vs `data / data / myApp '

アプリにimageFileを保存したい

「Google+クロッパーアプリ」で使用したい。

しかし、後で別の画像が開きます。

権限の問題だと思います。

私のコードでは、ここに保存します:

これは外部ストレージですか? Environment.getExternalStorageDirectory().getAbsolutePath()戻り値:_/storage/emulated/0/myApp/file1.tmp_

_adb Shell_を使用すると、ファイルが実際に保存されていることがわかります:_/storage/emulated/legacy/myApp/file1.tmp_

なぜ違いがあるのですか?

代わりにこの場所を使用する必要がありますか?これは外部ストレージですか?

getAppContext().getFilesDir().getParent()戻り値: `data/data/myApp '

16
Elad Benda

歴史的に、内部ストレージと外部ストレージの違いは次のとおりでした...

Internal: Android各アプリにプライベートストレージを割り当てるために使用されるデバイスの内部フラッシュストレージ。割り当てられたストレージは、他のアプリからのアクセスを防ぐために保護されます。ルート化されたデバイス)。

外部:多くの場合、セキュリティ制限のないSDカード、つまり、すべてのアプリは「外部」ストレージのすべての領域にアクセスできます。

Androidの新しいバージョンが登場し、新しいデバイスの内部フラッシュストレージがますます増えているため、内部と外部の違いがあいまいになっています。たとえば、Nexus 7にはSDカードスロットがありません。

真の外部ストレージのないデバイスの場合、古いアプリとの互換性を維持するためにAndroidがエミュレートされた外部ストレージを提供する必要があります。つまり、RAMは物理的に内部(取り外し不可)ですが、そのセクションはパーティション化されており、AndroidファイルシステムAPIはそのパーティションを「外部」で誰でも読み取り可能なものとして扱います。

次のような外部ストレージに表示されるパスについては...

_/storage/emulated/0/myApp/file1.tmp
/storage/emulated/legacy/myApp/file1.tmp
_

...それらのいずれか(おそらく両方)は、エミュレートされた外部ディレクトリとファイルの同じ部分へのリダイレクトまたは「仮想」パスです。

これは、デバイスごとに異なる可能性があるため、ハードコーディングされたパスを想定するのではなく、常に正しいAPI呼び出しを使用してファイルおよびディレクトリにアクセスすることが不可欠である理由です。

Environment.getExternalStorageDirectory()を使用すると、同じことを行う他のアプリが、そこで作成したファイルにアクセスできると確信できます。

getFilesDir()を使用すると、アプリにプライベートに割り当てられ、アプリにのみアクセス可能な内部ストレージのルートにアクセスします(ただし、ルート化された電話はプライベート/内部ストレージにアクセスできます)。

28
Squonk