2015-08-01 5 views
1

После прочтения документации по хранению файлов в Android, я вижу, что внешнее хранилище может включать в себя как съемную SD-карту, так и хранилище, которое является внутренним для устройства, то есть не снимается. Есть ли способ различать съемное хранилище и несъемное хранилище при выборе сохранения файла во внешнем хранилище?Внешнее хранилище Android против SD-карты

+0

http://stackoverflow.com/questions/7616974/how-to-check-internal-and-external-storage-if-exist –

+0

http://stackoverflow.com/questions/12087510/check- если-заместитель SDCard-это-настоящее-логическое-это-всегда-правда –

ответ

2

Я думаю, что вы не можете надежно различать внутреннее и внешнее хранилище (SD).

На первый взгляд может показаться, что вы можете использовать что-то вроде Environment.isExternalStorageRemovable(), но это ненадежно, потому что ваше «основное внешнее» устройство хранения вполне может быть внутренней памятью устройства, а не SD-картой.

Док для Environment.getExternalStorageDirectory() состояний:

Примечание: не следует путать слово "внешний" здесь. Этот каталог лучше воспринимать как медиа/общую память. Это файловая система, которая может хранить относительно большой объем данных и совместно используется во всех приложениях (не обеспечивает разрешения). Традиционно это SD-карта, но она также может быть реализована как встроенное хранилище в устройстве, которое отличается от защищенного внутреннего хранилища и может быть смонтировано как файловая система на компьютере.

В качестве примера, мой LG G4 имеет установлен внешний SD карта, и я могу видеть его с ADB (external_SD):

$ adb shell ls -la /storage/ 
drwx------ root  root    2015-02-28 01:10 USBstorage1 
drwx------ root  root    2015-02-28 01:10 USBstorage2 
drwx------ root  root    2015-02-28 01:10 USBstorage3 
drwx------ root  root    2015-02-28 01:10 USBstorage4 
drwx------ root  root    2015-02-28 01:10 USBstorage5 
drwx------ root  root    2015-02-28 01:10 USBstorage6 
dr-xr-xr-x root  root    2015-02-28 01:10 emulated 
drwxrwx--x root  sdcard_r   2015-07-31 08:19 external_SD 
lrwxrwxrwx root  root    2015-02-28 01:10 sdcard0 -> /storage/emulated/legacy 

Однако различные интерфейсы API для внешних возвращаемых значений хранения, доказать, что устройство использует внутреннюю память в качестве «основного» внешнего хранения:

  • Environment.getExternalStorageState: смонтированного
  • Environment.isExternalStorageEmulated: правда
  • Environment.isExternalStorageRemovable: ложные
  • Context.getExternalCacheDir:/хранение/эмулировать /0/Android/data/com.codeblast.storagetype/cache
  • Context.getExternalFilesDir:/хранение/эмулировать /0/Android/data/com.codeblast.storagetype/files

Выполнение кода на эмуляторе без внешней SD-карты возвращает точно такие же результаты.

Таким образом, вы не можете предположить, что /mnt/sdcard означает физическую SD-карту.

Возможно, вы пересмотрели то, что вы на самом деле пытаетесь выполнить, а не пытаетесь определить тип хранилища. :-)

Смежные вопросы