Вопрос по android – Различие между getExternalFilesDir и getExternalStorageDirectory ()

65

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

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

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

ТИА JB

Ваш Ответ

3   ответа
100
getExternalFilesDir()

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

getExternalStorageDirectory()

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

хорошо, подожди немного, скоро будетeureka момент :)
Важно знать, чтоgetExternalStorageDirectory() делаетnot necessarily -- может быть дажеnot usually - верните & quot; путь к вашей SD-карте. & quot; Вместо этого он возвращает «основной каталог внешнего хранилища». Документы (developer.android.com/reference/android/os/…) сказать:
Google Android хочет, чтобы вы использовали все, что они предоставляют в рамках. Это зависит от вашего выбора и требований к дизайну. Если вы не хотите, чтобы файлы оставались при удалении приложения, рекомендуется использоватьgetExternalFilesDir() или жеgetExternalCacheDir()
Итак, вы говорите, что ребята из Google Android хотят, чтобы вы использовали только API getExternalFilesDir () 8 и выше, поэтому, если вы соответствуете, ваши файлы будут удалены при удалении? Не поймите меня неправильно. Мне нужно такое поведение, поскольку я не хочу, чтобы файлы оставались рядом, если кто-то удаляет их. Другой пункт, в котором я не уверен, но экспериментирую сейчас, это именно то, как он возвращается, если там есть папка. Например, он вернет что-нибудь для этой строки: File (getExternalFilesDir (null), & quot; / ParentFldr / ChildFldr & quot;); GPGVM
Это потому, что в API 8 они представили расширенные функции медиа-сканера, которые позволяют сканировать данные из папок, таких как музыка, картинки, мелодии и т. Д. Эти каталоги создаются автоматически, только если вы используетеgetExternalFilesDir(), Теперь, поскольку эта функция не была доступна в API 7, поэтому они рекомендовали использоватьgetExternalStorageDirectory(), Просто...
13

! IMPORTANT UPDATE ! для тех, кто сталкивается с этим вопросом.

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

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

@ Одед, ты это проверял? Мое понимание документов и мой опыт работы с KitKat и более поздними устройствами отличается от вашего. (Жаль, что у меня не было времени, чтобы уточнить все детали сейчас. Может быть, позже.) По моему опыту, SGal прав. Тогда также есть Lollipop, который немного отличается.
Согласно документам, приложения, имеющие разрешение WRITE_EXTERNAL_STORAGE, МОГУТ записывать в другие пакеты & apos; внешнее хранилище, а не только свое. Это приложения, которые НЕ имеют разрешения, которые могут писать только в свой собственный каталог:developer.android.com/reference/android/content/…  & quot; Начиная с KITKAT, для чтения или записи по возвращаемому пути разрешения не требуются; он всегда доступен вызывающему приложению ... Для доступа к путям, принадлежащим другим пакетам, требуются WRITE_EXTERNAL_STORAGE и / или READ_EXTERNAL_STORAGE. & quot;
Этот ответ является явно ложным, согласно документации Android. Увидетьdeveloper.android.com/reference/android/… & quot; Начиная с уровня API 19, это разрешение не требуется для чтения / записи файлов в каталогах вашего приложения, возвращаемых getExternalFilesDir (String) и getExternalCacheDir (). & quot; (Обратите внимание, что уровень API 19 = KitKat.) Понятия не имею, как он получил так много голосов.
Это где "на большинстве устройств" начинает иметь значение, поскольку документация для Android обобщает идею, но у производителей иногда есть такие вещи, как InternalStorage (встроенное хранилище для данных приложения), ExternalStorage-Primary (also built-in storage с большей областью доступа) и ExternalStorage-Secondary (это будет монтироваться как SD-карты). Теперь вы можете угадать, какой путь получитьExternalStorageDirectory возвращает
Это не относится к неверной информации в вашем ответе. & quot; Поскольку приложения KitKat даже приложениям, имеющим разрешение WRITE_EXTERNAL_STORAGE, разрешено выполнять запись только в Android / data / data / your_package / на внешнее хранилище, a.k.a getExternalFilesDir () & quot ;. Согласно документации, это неправильно. С помощью WRITE_EXTERNAL_STORAGE приложения могут выполнять запись во все внешние хранилища.
37

First of all, we need to understand about what is difference between Internal Storage, External Storage (aka primary external storage) and Secondary External Storage?

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

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

Secondary External Storage: Съемное хранилище. Пример: SD-карта.

getExternalFilesDir (String type)

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

getExternalStorageDirectory ()

Он вернет путь к вторичному каталогу внешнего хранилища

@LarsH, насколько мне известно, в настоящее время на рынке нет ни телефона, ни ближайшего будущего, в котором не было бы встроенной первичной внешней памяти. Во времена пряников были телефоны, когда такие телефоны существовали, но не сейчас. Не могли бы вы назвать «некоторые» телефоны, которые не имеют встроенного "основного внешнего хранилища"?
@VicJordan Пожалуйста, напишите оFile getExternalStoragePublicDirectory (String type) а такжеFile getFilesDir () также
Спасибо Вик. Environment.getExternalStorageDirectory () выводит / хранилище / эмулируется / 0
Есть ли у вас документация для утверждения, что первичное внешнее хранилище всегда встроено, тогда как вторичное всегда съемное? Я думал, что это были независимые проблемы ... некоторые телефоны не имеют встроенного "внешнего" хранилище, в этом случае основным внешним хранилищем может быть съемная SD-карта.
Спасибо за объяснение различных типов хранения. Однако, возможно, отредактируйтеinternal storage Следует упомянуть, что вызов метода для получения этого значения - getFilesDir (). Ну, я думаю, этот метод на самом деле возвращает data / data / app_packageName / files, но это все еще внутреннее хранилище.

Похожие вопросы