Android permission read write external storage

Data and file storage overview

Android uses a file system that’s similar to disk-based file systems on other platforms. The system provides several options for you to save your app data:

  • App-specific storage: Store files that are meant for your app’s use only, either in dedicated directories within an internal storage volume or different dedicated directories within external storage. Use the directories within internal storage to save sensitive information that other apps shouldn’t access.
  • Shared storage: Store files that your app intends to share with other apps, including media, documents, and other files.
  • Preferences: Store private, primitive data in key-value pairs.
  • Databases: Store structured data in a private database using the Room persistence library.

The characteristics of these options are summarized in the following table:

Type of content Access method Permissions needed Can other apps access? Files removed on app uninstall?
App-specific files Files meant for your app’s use only From internal storage, getFilesDir() or getCacheDir()

From external storage, getExternalFilesDir() or getExternalCacheDir()

Never needed for internal storage

Not needed for external storage when your app is used on devices that run Android 4.4 (API level 19) or higher

No Yes
Media Shareable media files (images, audio files, videos) MediaStore API READ_EXTERNAL_STORAGE when accessing other apps’ files on Android 11 (API level 30) or higher

READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE when accessing other apps’ files on Android 10 (API level 29)

Permissions are required for all files on Android 9 (API level 28) or lower

Yes, though the other app needs the READ_EXTERNAL_STORAGE permission No
Documents and other files Other types of shareable content, including downloaded files Storage Access Framework None Yes, through the system file picker No
App preferences Key-value pairs Jetpack Preferences library None No Yes
Database Structured data Room persistence library None No Yes

The solution you choose depends on your specific needs:

How much space does your data require? Internal storage has limited space for app-specific data. Use other types of storage if you need to save a substantial amount of data. How reliable does data access need to be? If your app’s basic functionality requires certain data, such as when your app is starting up, place the data within internal storage directory or a database. App-specific files that are stored in external storage aren’t always accessible because some devices allow users to remove a physical device that corresponds to external storage. What kind of data do you need to store? If you have data that’s only meaningful for your app, use app-specific storage. For shareable media content, use shared storage so that other apps can access the content. For structured data, use either preferences (for key-value data) or a database (for data that contains more than 2 columns). Should the data be private to your app? When storing sensitive data—data that shouldn’t be accessible from any other app—use internal storage, preferences, or a database. Internal storage has the added benefit of the data being hidden from users.

Categories of storage locations

Android provides two types of physical storage locations: internal storage and external storage. On most devices, internal storage is smaller than external storage. However, internal storage is always available on all devices, making it a more reliable place to put data on which your app depends.

Removable volumes, such as an SD card, appear in the file system as part of external storage. Android represents these devices using a path, such as /sdcard .

Apps themselves are stored within internal storage by default. If your APK size is very large, however, you can indicate a preference within your app’s manifest file to install your app on external storage instead:

Permissions and access to external storage

On earlier versions of Android, apps needed to declare the READ_EXTERNAL_STORAGE permission to access any file outside the app-specific directories on external storage. Also, apps needed to declare the WRITE_EXTERNAL_STORAGE permission to write to any file outside the app-specific directory.

More recent versions of Android rely more on a file’s purpose than its location for determining an app’s ability to access, and write to, a given file. In particular, if your app targets Android 11 (API level 30) or higher, the WRITE_EXTERNAL_STORAGE permission doesn’t have any effect on your app’s access to storage. This purpose-based storage model improves user privacy because apps are given access only to the areas of the device’s file system that they actually use.

Android 11 introduces the MANAGE_EXTERNAL_STORAGE permission, which provides write access to files outside the app-specific directory and MediaStore . To learn more about this permission, and why most apps don’t need to declare it to fulfill their use cases, see the guide on how to manage all files on a storage device.

Scoped storage

To give users more control over their files and to limit file clutter, apps that target Android 10 (API level 29) and higher are given scoped access into external storage, or scoped storage, by default. Such apps have access only to the app-specific directory on external storage, as well as specific types of media that the app has created.

Use scoped storage unless your app needs access to a file that’s stored outside of an app-specific directory and outside of a directory that the MediaStore APIs can access. If you store app-specific files on external storage, you can make it easier to adopt scoped storage by placing these files in an app-specific directory on external storage. That way, your app maintains access to these files when scoped storage is enabled.

To prepare your app for scoped storage, view the storage use cases and best practices guide. If your app has another use case that isn’t covered by scoped storage, file a feature request. You can temporarily opt-out of using scoped storage.

View files on a device

To view the files stored on a device, use Android Studio’s Device File Explorer.

Additional resources

For more information about data storage, consult the following resources.

Videos

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.

Источник

Внешнее хранилище

Внешнее хранилище относится к хранилищу файлов, которое находится не во внутреннем хранилище и доступно не только для приложения, отвечающего за файл. Основное предназначение внешнего хранилища — предоставление места для размещения файлов для совместного использования приложениями или файлов слишком большого размера для внутреннего хранилища.

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

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

В Xamarin.Android чтение и запись в файлы практически идентична этим процессам в любых других приложениях .NET. Приложение Xamarin.Android определяет путь к файлу, который будет обработан, а затем использует стандартные идиомы .NET для доступа к файлам. Так как фактические пути к внутреннему и внешнему хранилищу могут отличаться в зависимости от устройства или от версии Android, не рекомендуется жестко задавать путь к файлам. Вместо этого Xamarin.Android предоставляет собственные API Android, которые помогут определить путь к файлам во внутреннем и внешнем хранилище.

В этом руководстве описываются основные понятия и API в Android, относящиеся к внешнему хранилищу.

Общедоступные и частные файлы во внешнем хранилище

Существует два разных типа файлов, которые приложение может хранить во внешнем хранилище:

Закрытые файлы — закрытые файлы — это файлы, характерные для вашего приложения (но которые по-прежнему доступны для чтения и записи в мире). В Android предполагается, что частные файлы хранятся в определенном каталоге во внешнем хранилище. Несмотря на то, что файлы называются «частными», они по-прежнему видимы и доступны для других приложений на устройстве, Android не предоставляет им специальные меры защиты.

Общедоступные файлы — это файлы, которые не считаются специфическими для приложения и предназначены для свободного доступа.

Разница между этими файлами в основном концептуальная. Файлы являются частными, так как они считаются частью приложения, в то время как общедоступные файлы — это любые другие файлы, которые существуют во внешнем хранилище. Android предоставляет два разных API-интерфейса для разрешения путей к частным и общедоступным файлам, но в остальном для чтения и записи в эти файлы используются одни и те же интерфейсы API .NET. Это те же API-интерфейсы, которые рассматриваются в разделе о чтении и записи.

Частные внешние файлы

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

Основное расположение для частных внешних файлов определяется путем вызова метода Android.Content.Context.GetExternalFilesDir(string type) . Этот метод возвращает объект Java.IO.File , представляющий частный каталог во внешнем хранилище для приложения. Передача null этому методу приведет к возвращению пути к каталогу хранилища пользователя для приложения. Например, для приложения с именем пакета com.companyname.app корневой каталог частных внешних файлов будет таким:

Этот документ будет ссылаться на каталог хранилища для личных файлов во внешнем хранилище как PRIVATE_EXTERNAL_STORAGE.

Параметр для GetExternalFilesDir() — это строка, указывающая GetExternalFilesDir() . Этот каталог предназначен для стандартного расположения в логической организации файлов. Строковые значения доступны через константы класса Android.OS.Environment :

Android.OS.Environment Каталог
DirectoryAlarms PRIVATE_EXTERNAL_STORAGE/Алармс
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/дЦим
DirectoryDownloads PRIVATE_EXTERNAL_STORAGE/download
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/документс
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Movies
DirectoryMusic PRIVATE_EXTERNAL_STORAGE/Мусик
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/нотификатионс
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/подкастс
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/рингтонес
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/пиктурес

Для устройств с несколькими разделами во внешнем хранилище каждый раздел будет содержать каталог, предназначенный для частных файлов. Метод Android.Content.Context.GetExternalFilesDirs(string type) возвращает массив Java.IO.Files . Каждый объект будет представлять частный каталог приложения для всех совместно используемых устройств с внешними хранилищами, где приложение может размещать принадлежащие ему файлы.

Точный путь к частному каталогу внешнего хранилища может отличаться в зависимости от устройства и версии Android. По этой причине приложения не должны жестко задавать путь к этому каталогу. Вместо этого они должны использовать API-интерфейсы Xamarin.Android, например Android.Content.Context.GetExternalFilesDir() .

Общедоступные внешние файлы

Общедоступные файлы — это файлы, которые существуют во внешнем хранилище и не хранятся в каталоге, который Android выделяет для частных файлов. Общедоступные файлы не удаляются при удалении приложения. Приложения Android должны получить разрешение, прежде чем они смогут считывать или записывать любые общедоступные файлы. Общедоступные файлы могут существовать везде во внешнем хранилище, но по соглашению в Android предусматривается, что общедоступные файлы будут существовать в каталоге, указанном свойством Android.OS.Environment.ExternalStorageDirectory . Это свойство будет возвращать объект Java.IO.File , который представляет основной каталог во внешнем хранилище. В качестве примера Android.OS.Environment.ExternalStorageDirectory может ссылаться на следующий каталог:

Этот документ будет ссылаться на каталог хранилища для общедоступных файлов во внешнем хранилище как PUBLIC_EXTERNAL_STORAGE.

Android также поддерживает концепцию каталогов приложений на PUBLIC_EXTERNAL_STORAGE. Эти каталоги в точности совпадают с каталогами приложений для PRIVATE_EXTERNAL_STORAGE и описаны в таблице в предыдущем разделе. Метод Android.OS.Environment.GetExternalStoragePublicDirectory(string directoryType) возвращает объект Java.IO.File , который соответствует общедоступному каталогу приложения. Параметр directoryType является обязательным и не может иметь значение null .

Например, вызов Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath вернет строку, которая будет выглядеть так:

Точный путь к общедоступному каталогу во внешнем хранилище может отличаться в зависимости от устройства и версии Android. По этой причине приложения не должны жестко задавать путь к этому каталогу. Вместо этого они должны использовать API-интерфейсы Xamarin.Android, например Android.OS.Environment.ExternalStorageDirectory .

Работа с внешним хранилищем

Как только приложение Xamarin.Android получит полный путь к файлу, оно должно использовать любой из стандартных API-интерфейсов .NET для создания, чтения, записи или удаления файлов. Это увеличивает объем кроссплатформенного кода для приложения. Тем не менее, прежде чем пытаться получить доступ к файлу, для приложения Xamarin.Android необходимо убедиться, что к этому файлу можно осуществлять доступ.

  1. Проверка внешнего хранилища . в зависимости от характера внешнего хранилища возможно, что оно не может быть подключено и использовано приложением. Все приложения должны проверять состояние внешнего хранилища, прежде чем пытаться его использовать.
  2. Выполнение проверки разрешений среды выполнения — приложение Android должно запрашивать разрешение у пользователя для доступа к внешнему хранилищу. Это означает, что запрос на разрешение во время выполнения должен быть сделан до осуществления любого доступа к файлу. Разрешения для руководств в Xamarin. Android содержат дополнительные сведения о разрешениях Android.

Каждая из этих двух задач будет описана ниже.

Проверка доступности внешнего хранилища

Первым действием перед записью во внешнее хранилище является проверка его доступности для чтения или записи. Свойство Android.OS.Environment.ExternalStorageState содержит строку для определения состояния внешнего хранилища. Это свойство будет возвращать строку, которая представляет состояние. Эта таблица представляет собой список значений ExternalStorageState , которые могут быть возвращены Environment.ExternalStorageState :

ExternalStorageState Описание
MediaBadRemoval Носитель внезапно удален без отключения надлежащим образом.
MediaChecking Носитель присутствует, но проходит проверку диска.
MediaEjecting Носитель пребывает в процессе отключения и извлечения.
MediaMounted Носитель подключен, в нем можно выполнять операции чтения и записи.
MediaMountedReadOnly Носитель подключен, но в нем можно выполнять только операции чтения.
MediaNofs Носитель присутствует, но не содержит файловой системы, подходящей для Android.
MediaRemoved Носитель отсутствует.
MediaShared Носитель присутствует, но не подключен. Его использует через USB-порт другое устройство.
MediaUnknown Состояние носителя не распознано Android.
MediaUnmountable Носитель присутствует, но его не удалось подключить к Android.
MediaUnmounted Носитель присутствует, но отключен.

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

Разрешения внешнего хранилища

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

Все приложения Android должны объявить одно из двух разрешений для внешнего хранилища в AndroidManifest.xml. Для обнаружения разрешений необходимо добавить один из следующих двух uses-permission элементов в uses-permission :

Если пользователь предоставил разрешение WRITE_EXTERNAL_STORAGE , то также неявно предоставляется и READ_EXTERNAL_STORAGE . Нет необходимости запрашивать оба разрешения в AndroidManifest.xml.

Разрешения также можно добавить на вкладке Манифест Android в разделе свойств решения:

Разрешения также можно добавить с помощью вкладки Манифест Android на панели свойств решения:

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

Источник

Читайте также:  Андроид синхронизация с контактами яндекса
Оцените статью