Как указано в рабочем процессе использования разрешений, если ваше приложение запрашивает разрешения, вы должны объявить их в файле манифеста. Эти декларации помогают магазинам приложений и пользователям понять, какие разрешения может запрашивать ваше приложение.
Процесс запроса разрешения зависит от его типа:
- Если разрешение относится к категории предоставляемых при установке, например обычное разрешение или разрешение на основе подписи, оно предоставляется автоматически при установке приложения.
- Если разрешение является динамическим разрешением или специальным разрешением, а приложение установлено на устройстве с Android 6.0 (уровень API 23) или более поздней версии, вы должны запросить динамическое разрешение или специальное разрешение самостоятельно.
Добавьте декларацию в манифест приложения
Чтобы объявить разрешение, которое может запрашивать приложение, добавьте в его файл манифеста элемент <uses-permission>. Например, если приложению нужен доступ к камере, в файле AndroidManifest.xml будет следующая строка:
<manifest ...> <uses-permission android:name="android.permission.CAMERA"/> <application ...> ... </application> </manifest>
Как объявить аппаратное обеспечение необязательным
Некоторые разрешения, например CAMERA, позволяют приложению получать доступ к аппаратным компонентам, которые есть только на некоторых устройствах Android. Если в вашем приложении объявлено одно из разрешений, связанных с аппаратным обеспечением, подумайте, может ли оно работать на устройстве, где такое обеспечение отсутствует. В большинстве случаев аппаратное обеспечение необязательно, поэтому лучше объявить его таковым, установив для android:required значение false в объявлении <uses-feature>, как показано в следующем фрагменте кода из файла AndroidManifest.xml:
<manifest ...> <application> ... </application> <uses-feature android:name="android.hardware.camera" android:required="false" /> <manifest>
Определите доступность оборудования
Если вы укажете, что аппаратное обеспечение необязательно, ваше приложение можно будет запустить на устройстве, где его нет. Чтобы проверить, есть ли на устройстве определенный аппаратный компонент, используйте метод hasSystemFeature(), как показано в следующем фрагменте кода. Если аппаратное обеспечение недоступно, отключите эту функцию в приложении.
Kotlin
// Check whether your app is running on a device that has a front-facing camera. if (applicationContext.packageManager.hasSystemFeature( PackageManager.FEATURE_CAMERA_FRONT)) { // Continue with the part of your app's workflow that requires a // front-facing camera. } else { // Gracefully degrade your app experience. }
Java
// Check whether your app is running on a device that has a front-facing camera. if (getApplicationContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA_FRONT)) { // Continue with the part of your app's workflow that requires a // front-facing camera. } else { // Gracefully degrade your app experience. }
Как объявить разрешения по уровню API
Чтобы объявить разрешение только на устройствах, поддерживающих динамические разрешения (с Android 6.0, уровень API 23, или более поздней версией), используйте элемент <uses-permission-sdk-23> вместо <uses-permission>.
При использовании любого из этих элементов вы можете задать атрибут maxSdkVersion, чтобы указать, что устройствам с версией Android выше указанного значения не требуется определенное разрешение. Это позволяет убрать ненужные разрешения, сохранив совместимость со старыми устройствами.
Например, в приложении может показываться медиаконтент, такой как фотографии или видео, созданные пользователем в приложении. В этом случае вам не нужно использовать разрешение READ_EXTERNAL_STORAGE на устройствах с Android 10 (уровень API 29) или более поздней версии, если ваше приложение предназначено для Android 10 или более поздней версии. Однако для совместимости со старыми устройствами вы можете объявить разрешение READ_EXTERNAL_STORAGE и задать для android:maxSdkVersion значение 28.