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

Я хочу сохранить в своем приложении файл imageFile

Я хочу, чтобы приложение "Google+ cropper" использовало его.

Но позже открывается другое изображение.

Я предполагаю, что это проблема с правами.

В моем коде я сохраняю здесь:

Это внешнее хранилище? Environment.getExternalStorageDirectory().getAbsolutePath(), который возвращает: /storage/emulated/0/myApp/file1.tmp

с помощью adb shell видно, что файл фактически сохраняется в: /storage/emulated/legacy/myApp/file1.tmp

почему разница?

Я должен использовать это место вместо этого? Это внешнее хранилище?

getAppContext().getFilesDir().getParent(), который возвращает: `data/data/myApp '

Ответы

Ответ 1

Исторически разница между внутренним и внешним хранилищем была следующей:

Внутренний: Внутренняя флеш-память устройства Android, используемого для распределения частного хранилища для каждого приложения. Выделенное хранилище защищено для предотвращения доступа любым другим приложением (за исключением корневых устройств).

Внешний: Во многих случаях SD-карта без ограничений безопасности, то есть все приложения могут обращаться ко всем областям "внешнего" хранилища.

По мере появления новых версий Android и новых устройств все больше становится внутреннее флеш-хранилище, разница между внутренним и внешним становится размытой. Например, у моего Nexus 7 нет слота для SD-карты.

В случае устройств без подлинного внешнего хранилища все еще необходимо, чтобы Android предоставил эмулированное внешнее хранилище, чтобы оставаться совместимым со старыми приложениями. Другими словами, оперативная память является физически внутренней (несъемной), но ее часть разделена, и API-интерфейсы файловой системы Android рассматривают этот раздел как "внешний" и читаемый в мире.

Что касается путей, которые вы видите для внешнего хранилища, например...

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

... тот или иной из них (возможно, оба) является перенаправлением или "виртуальным" путем к той же части эмулируемого внешнего каталога и файла.

Вот почему важно всегда использовать правильный вызов API, чтобы получить доступ к файлам и каталогам, а не предполагать жестко закодированный путь, поскольку он может сильно отличаться от устройства к устройству.

Если вы используете Environment.getExternalStorageDirectory(), вы можете быть уверены, что любое другое приложение, которое сделает то же самое, сможет получить доступ к любым файлам, которые вы там создаете.

Если вы используете getFilesDir(), вы получаете доступ к корню внутреннего хранилища, выделенному в приватном приложении и доступному только для вашего приложения (хотя, как я уже говорил, у корневого телефона может быть доступ к частному/внутреннему хранилищу).