2012-04-12 3 views
49

Я понимаю, что ExternalFiles должен использоваться на API 8, а getExternalStorageDirectory - на 7 и ниже. Однако я немного смущен между использованием. Например, я хотел проверить, что папка, в которой существует и ранее вы бы использовать что-то вроде:Diff между getExternalFilesDir и getExternalStorageDirectory()

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child"); 

Однако каждый пример я вижу, говорит использовать getExternalFilesDir (нуль), FILE.EXT. Поскольку я выше API 8, я хочу использовать этот метод, но как я могу просто проверить папку? Я проверю существование файлов в другой точке, но пока просто хочу посмотреть, существуют ли папки?

ТИА JB

ответ

86
getExternalFilesDir() 

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

getExternalStorageDirectory() 

Он возвращает корневой путь к вашей SD-карты (например мнт/SDCard/). Если вы сохраните данные по этому пути и удалите приложение, эти данные не будут потеряны.

+1

Так вы говорите, что Google Android ребята хотят, чтобы вы только использовать getExternalFilesDir API 8() и выше, следовательно, если вы совместимы ваши файлы будут удалены при удалении? Не поймите меня неправильно. Я хочу этого поведения, поскольку я не хочу, чтобы файлы оставались, если кто-то удалил. Другой элемент, который я не уверен, но экспериментирую сейчас, точно так же, как он возвращается, если есть папка. Например, он вернет что-нибудь для этой строки: File (getExternalFilesDir (null), "/ ParentFldr/ChildFldr"); – GPGVM

+3

Google Android хочет, чтобы вы использовали все, что они предоставляют в рамках. Таким образом, ваш выбор и требования к дизайну. Если вы не хотите, чтобы файлы оставались на месте при удалении приложения, вам рекомендуется использовать ** getExternalFilesDir() ** или ** getExternalCacheDir() ** – waqaslam

+0

Ну, я уверен, что я точно вижу, что вы говорите. . Я просто смущен этой линией от Dev Docs. «Если вы используете API-уровень 7 или ниже, используйте getExternalStorageDirectory(), ...» и «Если вы используете API-уровень 8 или выше, используйте getExternalFilesDir(), чтобы открыть файл, который ...» эти два строки идут отсюда: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal. Я считаю, что вы и использовали оба успеха: я просто не хотел использовать что-то, что может исчезнуть из будущих версий API. – GPGVM

11

! ВАЖНОЕ ОБНОВЛЕНИЕ! для тех, кто сталкивается с этим вопросом.

Поскольку это несколько старый вопрос, просто хотел предоставить дополнительную информацию. Так как KitKat даже приложения, которые имеют WRITE_EXTERNAL_STORAGE разрешения являются разрешено только написать Android/данные/данные/your_package/ на внешнем накопителе, акаgetExternalFilesDir()

Если вы будете пытаться писать getExternalStorageDirectory() + "/somefolder/anotherfolder/" вы будете получить SecurityException на большинстве устройств.

+7

В соответствии с документами приложения, имеющие разрешение WRITE_EXTERNAL_STORAGE, могут записываться на внешнее хранилище других пакетов, а не только на свои собственные. Это приложения, которые НЕ имеют разрешения, которые могут только записываться в их собственный каталог: https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String) " Начиная с KITKAT, для чтения или записи на возвращаемый путь не требуется никаких разрешений, он всегда доступен вызывающему приложению ... Для доступа к путям, принадлежащим другим пакетам, требуются WRITE_EXTERNAL_STORAGE и/или READ_EXTERNAL_STORAGE. " – Oded

+0

Это то, что «на большинстве устройств» начинает иметь значение, поскольку андроидные документы обобщают идею, но у производителей иногда есть такие вещи, как InternalStorage (встроенное хранилище данных приложения), ExternalStorage-Primary (* также встроенное хранилище * с большим область доступа) и ExternalStorage-Secondary (это будет монтироваться как SD-карты). Теперь вы можете угадать, какой путь получить * Внешний * StorageDirectory возвращает – SGal

+5

Это не касается неправильной информации в вашем ответе. «Так как KitKat даже приложениям, имеющим разрешение WRITE_EXTERNAL_STORAGE, разрешено писать только на Android/data/data/your_package/на внешнем хранилище, a.k.a getExternalFilesDir()». В документах это неправильно.С WRITE_EXTERNAL_STORAGE приложения могут записываться во все внешние хранилища. – Oded

25

Прежде всего, нам нужно понять, что такое разница между внутренним хранилищем, внешним хранилищем (также основным внешним хранилищем) и вторичным внешним хранилищем?

Внутреннее хранилище: - это хранилище, недоступное для пользователя, за исключением установленных приложений (или путем укоренения их устройства). Пример: данные/данные/app_packageName

Первичный внешний накопитель в застроенных общее хранилище, которое «доступны пользователю путем подключения кабеля USB и установки его в качестве диска на хост-компьютере». Пример: Когда мы говорим Nexus 5 32 ГБ.

Вторичное хранение: Съемное хранилище. Пример: SD-карта.

getExternalFilesDir (String type) 

Он возвращает путь к папке с файлами внутри Android/data/data/your_package/на основном внешнем хранилище. Это встроенное хранилище.

getExternalStorageDirectory() 

Она возвращает путь основного внешнего каталога хранения

+0

Спасибо, что объяснили различные типы хранилищ. Однако, возможно, отредактируйте элемент _internal storage_, чтобы упомянуть, что вызов метода для получения этого значения - getFilesDir(). Ну, я думаю, этот метод фактически возвращает данные/данные/app_packageName/files, но он все еще является внутренним хранилищем. – raddevus

+2

@ VicJordan Пожалуйста, напишите о 'File getExternalStoragePublicDirectory (String type)' и 'File getFilesDir()' также – AnV

+0

Спасибо Vic. Environment.getExternalStorageDirectory() output/storage/emulated/0 – gimmegimme

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