← Назад к вопросам

К каким файлам дает доступ Permission в Android

1.0 Junior🔥 81 комментариев
#Android компоненты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Доступ к файлам через разрешения в Android

В Android доступ к файлам регулируется системой разрешений (Permissions), которая эволюционировала с версиями ОС. Разрешения делятся на обычные (Normal) и опасные (Dangerous), причем доступ к файлам обычно относится к опасным, так как затрагивает приватность пользователя или безопасность устройства.

Основные разрешения для доступа к файлам

1. READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE

Эти разрешения предоставляют доступ к общему хранилищу (shared storage), которое включает публичные директории, такие как Downloads, Documents, Pictures, DCIM, Movies, Music.

  • READ_EXTERNAL_STORAGE: позволяет читать файлы из общих директорий.
  • WRITE_EXTERNAL_STORAGE: позволяет записывать, изменять или удалять файлы в общих директориях.

Важно: Начиная с Android 10 (API 29) и Scoped Storage, эти разрешения дают ограниченный доступ. Приложение может получить полный доступ только к своим собственным файлам и специфическим типам медиа через MediaStore.

// Запрос разрешений в Android 6.0+ (API 23+)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
    != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, 
        arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 
        REQUEST_CODE)
}

2. MANAGE_EXTERNAL_STORAGE

Введено в Android 11 (API 30) для приложений, которым требуется полный доступ ко всем файлам (all files access). Это разрешение позволяет обходить ограничения Scoped Storage, но его использование строго контролируется Google Play. Оно необходимо для файловых менеджеров, резервного копирования и подобных приложений.

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

Приложение должно направлять пользователя в системные настройки для включения этого разрешения:

val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)

3. Доступ к специфическим типам медиафайлов (Android 10+)

Вместо широких разрешений на хранилище, Android 10+ предлагает целевые разрешения для доступа к определенным типам медиа:

  • ACCESS_MEDIA_LOCATION: доступ к геолокации в фотографиях (например, в EXIF данных).
  • Разрешения для отдельных коллекций через MediaStore без явного запроса, если приложение использует API MediaStore.

Особенности доступа в зависимости от версии Android

  • До Android 10: READ/WRITE_EXTERNAL_STORAGE давали полный доступ к общему хранилищу.
  • Android 10 (API 29): Введена Scoped Storage. Приложения имеют доступ только к своим файлам и публичным медиа-коллекциям через MediaStore. Для доступа к другим файлам требуется использовать системный файловый пикер (Storage Access Framework).
  • Android 11+: Усилена Scoped Storage. MANAGE_EXTERNAL_STORAGE становится основным способом для полного доступа, но требует одобрения Google Play.

Storage Access Framework (SAF)

Для доступа к файлам вне Scoped Storage без разрешения MANAGE_EXTERNAL_STORAGE используется Storage Access Framework. Он позволяет пользователю выбирать файлы или директории через системный интерфейс, предоставляя приложению временный доступ.

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    type = "image/*"
}
startActivityForResult(intent, REQUEST_CODE)

Практические рекомендации

  1. Минимизируйте запросы разрешений: Используйте Scoped Storage и MediaStore для работы с медиафайлами.
  2. Для файловых операций внутри приложения используйте внутреннее хранилище (getFilesDir(), getCacheDir()), которое не требует разрешений.
  3. Для общих файлов предпочитайте Storage Access Framework, чтобы избежать жестких разрешений.
  4. Всегда проверяйте доступ динамически на Android 6.0+ и обрабатывайте отказы пользователя.

Пример структуры запроса разрешений:

private fun requestStoragePermission() {
    when {
        ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
            == PackageManager.PERMISSION_GRANTED -> {
            // Разрешение есть, работаем с файлами
            loadFiles()
        }
        ActivityCompat.shouldShowRequestPermissionRationale(this, 
            Manifest.permission.READ_EXTERNAL_STORAGE) -> {
            // Показываем объяснение пользователю
            showExplanationDialog()
        }
        else -> {
            // Запрашиваем разрешение
            ActivityCompat.requestPermissions(this, 
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 
                REQUEST_CODE)
        }
    }
}

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