Начиная с Android 6 Marshmallow стало необходимо во время работы приложения запрашивать у пользователя разрешение на доступ к функциям устройства, связанным с персональными данными (например, к контактам или микрофону). На примере доступа к камере разберем данный вопрос.
Проверка наличия и запрос разрешений (App Permissions) в Android
В общем случае необходимые разрешения (App Permissions) для приложения указываются в файле AndroidManifest.xml. Для камеры это будет так:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="..."> <uses-permission android:name="android.permission.CAMERA"/> ... </manifest> |
До Android 6 этого было бы достаточно. Но теперь используя так называемые опасные разрешения (Dangerous permissions) перед каждым моментом использования функциональности разрешения необходимо проверять его наличие.
1 2 3 4 5 6 7 |
// проверка наличия разрешения на использование камеры if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // разрешение не предоставлено } else { // разрешение предоставлено } |
При этом для получения безопасных разрешений (не связанных с персональными данными пользователя, например, доступ в Интернет) достаточно uses-permission в Манифесте.
Если опасное разрешение отсутствует, то его нужно запросить:
1 |
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); |
Где MY_PERMISSIONS_REQUEST_CAMERA — пользовательская константа с кодом запроса. Этот код в дальнейшем используется для отслеживания ответа пользователя на запрос разрешения.
1 2 |
// объявим константу, содержащую код, передаваемый в запрос на получение разрешения, для последующего отслеживания ответа пользователя на запрос private final int MY_PERMISSIONS_REQUEST_CAMERA = 100; |
В результате запроса пользователь увидит примерно следующее окно на своем устройстве:
Ответ пользователя на запрос нужно обработать. Для этого переопределим метод Активности onRequestPermissionsResult.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// вызывается после ответа пользователя на запрос разрешения @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_CAMERA: { // если пользователь закрыл запрос на разрешение, не дав ответа, массив grantResults будет пустым if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // разрешение было предоставлено // выполните здесь необходимые операции для включения функциональности приложения, связанной с запрашиваемым разрешением } else { // разрешение не было предоставлено // выполните здесь необходимые операции для выключения функциональности приложения, связанной с запрашиваемым разрешением } return; } } } |
Ответ на запрос отслеживается как раз по константе MY_PERMISSIONS_REQUEST_CAMERA.
Объясняем пользователю необходимость запроса доступа к функциям устройства
Если пользователь во время первого запроса разрешений на доступ к функции смартфона/планшета ответил отрицательно, Google рекомендует при последующем запросе показать окно с объяснениями — для чего и зачем вашему приложению понадобился доступ, например, к камере.
При этом для проверки необходимости показа объяснений есть специальный метод shouldShowRequestPermissionRationale. Логика в коде будет следующая:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// проверка наличия разрешения на использование камеры if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // разрешение не предоставлено // нужно ли показывать объяснение для чего приложению нужно требуемое разрешение? // shouldShowRequestPermissionRationale() возвращает true, если пользователь ранее уже отклонял запрос на предоставление разрешения // возвращает false если запрос разрешения происходит впервые или если пользователь в ответ на прежний запрос выставил опцию // Don't ask again в диалоговом окне запроса if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { // асинхронно покажите окно с объяснением - для чего приложению нужно данное разрешение // не блокируйте данный поток в ожидании ответа пользователя! // после того, как пользователь закроет окно с объяснениями, запросите разрешение еще раз } else { // не требуется показывать объяснение. запрашиваем разрешение ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); } } else { // разрешение уже было предоставлено } |
Видеоурок с подробными комментариями
Дополнительную информацию о запросе App Permissions можно найти здесь: Request App Permissions.
Поделиться в соц. сетях: