Статьи

Понимание разрешений в Android M

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

Устаревший диалог установки времени доступа

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

Следует отметить, что эта статья была написана до официального выпуска Android M, поэтому некоторая информация может измениться с официальным выпуском.

В то время как Android M по-прежнему требует объявления разрешений в AndroidManifest.xml , теперь пользователям потребуется одобрить или запретить использование этого разрешения во время выполнения. Одним из важных изменений в новой версии Android является то, что android.permission.INTERNET и android.permission.WRITE_EXTERNAL_STORAGE были понижены с уровня опасности на нормальный . Это означает, что вам не нужно запрашивать пользователя перед использованием.

При запросе одобрения разрешения пользователю будет предложено на основе группы разрешений, а не будет предложено утвердить каждое разрешение в группе. Это означает, что если вашему приложению необходимо отправлять и получать SMS-сообщения, вашему пользователю будет предложено только утвердить группу разрешений SMS. Ниже приведен список поддерживаемых в настоящее время групп разрешений в Android M Developer Preview 2, как видно из настроек системы.

Список поддерживаемых в настоящее время групп разрешений

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

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

Если пользователь не утвердил разрешение, вы можете предоставить ему диалоговое окно запроса разрешения. Когда вы в первый раз представите это пользователю, ему придется либо отклонить, либо одобрить разрешение.

Однако, если они ранее отказали в разрешении и их снова попросили, у них будет возможность отказаться от того, чтобы их снова запрашивали.

Блок-схема запроса разрешений

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

Если он равен PackageManager.PERMISSION_GRANTED , вы можете продолжить, как и ожидалось. Однако, если это разрешение не было ранее предоставлено, вы можете запросить его с помощью requestPermissions , передав массив строк разрешений и пользовательский код запроса int для отслеживания логического потока вашего приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
int hasLocationPermission = checkSelfPermission( Manifest.permission.ACCESS_FINE_LOCATION );
int hasSMSPermission = checkSelfPermission( Manifest.permission.SEND_SMS );
List<String> permissions = new ArrayList<String>();
if( hasLocationPermission != PackageManager.PERMISSION_GRANTED ) {
    permissions.add( Manifest.permission.ACCESS_FINE_LOCATION );
}
 
if( hasSMSPermission != PackageManager.PERMISSION_GRANTED ) {
    permissions.add( Manifest.permission.SEND_SMS );
}
 
if( !permissions.isEmpty() ) {
    requestPermissions( permissions.toArray( new String[permissions.size()] ), REQUEST_CODE_SOME_FEATURES_PERMISSIONS );
}

После requestPermissions пользователю предоставляется диалоговое окно запроса для каждой группы разрешений, для которой ваше приложение запрашивает разрешение. Рекомендуется запрашивать разрешения только по мере необходимости, а не навалом, когда ваш пользователь впервые запускает ваше приложение.

Диалог запроса на Android M

Когда ваш пользователь onRequestPermissionsResult с диалоговыми onRequestPermissionsResult , onRequestPermissionsResult и к нему можно получить доступ в вашей Activity . Здесь вы либо запускаете свою функцию, либо обрабатываете ситуацию, когда ваш пользователь отказал в одном или нескольких разрешениях.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch ( requestCode ) {
        case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: {
            for( int i = 0; i < permissions.length; i++ ) {
                if( grantResults[i] == PackageManager.PERMISSION_GRANTED ) {
                    Log.d( «Permissions», «Permission Granted: » + permissions[i] );
                } else if( grantResults[i] == PackageManager.PERMISSION_DENIED ) {
                    Log.d( «Permissions», «Permission Denied: » + permissions[i] );
                }
            }
        }
        break;
        default: {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

В то время как приложения, созданные для Android M, необходимы для реализации новых диалогов и методов доступа, приложения, созданные для предыдущих версий Android, по-прежнему будут предоставлять пользователям список разрешений во время установки. Хотя разрешения принимаются до того, как пользователи смогут использовать ваше приложение, их все равно можно отозвать в любое время.

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

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