diff options
Diffstat (limited to 'docs/html-intl/intl/ru/preview/features/runtime-permissions.jd')
-rw-r--r-- | docs/html-intl/intl/ru/preview/features/runtime-permissions.jd | 794 |
1 files changed, 794 insertions, 0 deletions
diff --git a/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd b/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd new file mode 100644 index 0000000..7d12b2d --- /dev/null +++ b/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd @@ -0,0 +1,794 @@ +page.title=Разрешения +page.tags=previewresources, androidm +page.keywords=разрешения, среда выполнения, предварительная версия +page.image={@docRoot}preview/features/images/permissions_check.png +@jd:body + + +<div id="qv-wrapper"> + <div id="qv"> + <h2>Краткое описание</h2> + <ul> + <li>Если ваше приложение предназначено для пакета SDK M Preview, пользователю будет предложено предоставить для него разрешения + не в процессе установки, а при работе с приложением.</li> + <li>Пользователь также может в любой момент отозвать разрешения, воспользовавшись экраном приложения «Настройки» +.</li> + <li>Ваше приложение должно проверять наличие соответствующих разрешений при каждом запуске. +</li> + </ul> + + <h2>Содержание документа</h2> + <ol> + <li><a href="#overview">Обзор</a></li> + <li><a href="#coding">Добавление в код разрешений на выполнение</a></li> + <li><a href="#testing">Тестирование разрешений на выполнение</a></li> + <li><a href="#best-practices">Советы и рекомендации</a></li> + </ol> + +<!-- + <h2>Related Samples</h2> + <ol> + <li></li> + </ol> +--> + +<!-- + <h2>See also</h2> + <ol> + <li></li> + </ol> +--> + </div> <!-- qv --> +</div> <!-- qv-wrapper --> + + +<p> + В версии M Developer Preview представлена новая модель разрешений для приложений, которая +оптимизирует для пользователей процесс установки и обновления приложений. Если приложение, +работающее в M Preview, поддерживает новую модель разрешений, пользователю не нужно предоставлять какие-либо +разрешения при установке приложения или его обновлении. Вместо этого приложение +запрашивает разрешения, когда в них возникает необходимость, — в таких случаях система отображает для пользователя диалоговое окно с просьбой предоставить +соответствующее разрешение. +</p> + +<p> + Если приложение поддерживает новую модель разрешений, его, тем не менее, можно установить и +запустить на устройстве под управлением одной из более ранних версий Android, и оно будет использовать старую модель +разрешений. +</p> + +<h2 id="overview"> + Обзор +</h2> + +<p> + В версии M Developer Preview представлена новая +модель разрешений. Ниже приводится краткий обзор ее ключевых компонентов: +</p> + +<ul> + <li> + <strong>Объявление разрешений.</strong> Все разрешения, которые требуются +приложению, объявляются в его манифесте, как и в более ранних версиях платформы Android. + </li> + + <li> + <strong>Группы разрешений.</strong> Разрешения +<em>группируются</em> по типу их функциональных возможностей. Например, в группе разрешений +<code>CONTACTS</code> находятся разрешения на чтение и запись +контактов пользователя и информации из его профиля. + </li> + + <li> + <p><strong>Ограниченные разрешения, предоставляемые во время установки.</strong> Когда +пользователь устанавливает или обновляет приложение, система предоставляет такому приложению все запрашиваемые им +разрешения, соответствующие константе {@link +android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}. + Например, разрешения для будильника и подключения к Интернету соответствуют константе {@link +android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}, +поэтому они предоставляются автоматически во время установки. + </p> + + <p>Система также может предоставить приложению подпись и системные разрешения, как описано в разделе +<a href="#system-apps">Предоставление приложениям системных разрешений и +подписи</a>. Пользователю <em>не предлагается</em> предоставить какие-либо разрешения +во время установки.</p> + </li> + + <li> + <strong>Предоставление пользователем разрешений во время выполнения.</strong> Когда приложение запрашивает разрешение, +система отображает для пользователя соответствующее диалоговое окно, а затем вызывает функцию обратного вызова приложения +с целью уведомить его о том, предоставлены ли необходимые разрешения. Если +пользователь предоставляет разрешение, приложение получает весь набор разрешений в рамках данной функциональной области +разрешения, который был объявлен в манифесте приложения. + </li> + +</ul> + +<p> + Новая модель разрешений влияет на поведение приложений при работе с функциями, для +которых требуются разрешения. При использовании этой модели в разработке + обратите внимание на следующие рекомендации: +</p> + +<ul> + + <li> + <strong>Всегда проверяйте наличие разрешений.</strong> Когда приложению необходимо выполнить +какое-либо действие, для которого требуется разрешение, оно должно сначала проверить, +имеется ли у него такое разрешение. Если разрешение отсутствует, приложение +должно запросить его. + </li> + + <li> + <strong>Если вам не дают разрешения, выходите из положения красиво.</strong> Если у приложения +нет нужного разрешения, оно должно обработать эту ошибку разумно. + Например, если разрешение требуется лишь для необязательной функции, приложение может +просто отключить ее. Если же приложение не может работать без данного разрешения, + оно может отключить все свои функциональные возможности и проинформировать пользователя, +что для работы ему требуется разрешение. + </li> + + <div class="figure" style="width:220px" id="fig-perms-screen"> + <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220"> + <p class="img-caption"> + <strong>Рисунок 1.</strong> Экран разрешений в настройках приложения. + </p> + </div> + + <li> + <strong>Разрешения можно отзывать.</strong> Пользователи могут в любое время отозвать разрешения +приложения. Когда пользователь отзывает разрешения, +приложение <em>не</em> уведомляется об этом. Снова повторим, что приложение должно всегда проверять наличие +разрешений, прежде чем выполнять любые действия, для которых они необходимы. + </li> +</ul> + +<p class="note"> + <strong>Примечание.</strong> Если приложение предназначено для M Developer Preview, оно +<em>должно в обязательном порядке</em> использовать новую модель разрешений. +</p> + +<p> + На момент выпуска M Developer Preview не все приложения Google в полной мере реализуют + новую модель разрешений. Google обновляет эти приложения +по мере разработки M Developer Preview, чтобы они должным образом поддерживали настройки +разрешений. +</p> + +<p class="note"> + <strong>Примечание.</strong> Если у вашего приложения имеется собственная поверхность API-интерфейса, прежде чем проксировать +разрешения, убедитесь сначала в том, что у вызывающей операции имеются надлежащие +разрешения на доступ к данным. +</p> + +<h3 id="system-apps"> + Предоставление приложениям системных разрешений и подписи +</h3> + +<p> + Как правило, когда пользователь устанавливает приложение, система предоставляет такому приложению только те +разрешения, которые соответствуют константе {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL +PROTECTION_NORMAL}. Однако в определенных ситуациях система предоставляет +приложению больше разрешений: +</p> + +<ul> + <li>если приложение является частью системного образа, ему автоматически предоставляются все +разрешения, обозначенные в его манифесте; + </li> + + <li>если в манифесте приложения запрашиваются разрешения, соответствующие константе {@link +android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE}, +а для подписи приложения использовался то же сертификат, что и для приложения, +объявившего эти разрешения, система предоставляет запрашивающему приложению необходимые разрешения при +установке. + </li> +</ul> + +<p> + В обоих случаях пользователь по-прежнему может в любое время отозвать разрешения, обратившись к +экрану <strong>Настройки</strong> и выбрав <strong>Приложения +></strong> <i>название_приложения</i> <strong>> Разрешения</strong>. Поэтому приложение все равноу +должно проверять наличие разрешений во время выполнения и при необходимости запрашивать их. + +</p> + +<h3 id="compatibility"> + Совместимость с предыдущими и последующими версиями +</h3> + +<p> + Если приложение не предназначено для M Developer Preview, оно +продолжает использовать старую модель разрешений даже на устройствах под управлением M Preview. В таком случае при установке приложения + система предлагает пользователю предоставить все разрешения, +указанные в манифесте приложения. +</p> + +<p class="note"> + <strong>Примечание.</strong> На устройствах под управлением M Developer Preview пользователь может отключить +разрешения для любого приложения (включая устаревшие приложения) на экране «Настройки». + Если пользователь решит отключить разрешения для устаревших приложений, система +автоматически отключит соответствующие функциональные возможности. Когда приложение пытается +выполнить операцию, для которой требуется такое разрешение, это +не обязательно приведет к возникновению исключения. Вместо этого оно может выдать пустой набор данных, +сигнал об ошибке или иным образом обозначить непредвиденное поведение. Например, если запросить +календарь, не имея соответствующего разрешения, метод возвратит пустой набор данных. +</p> + +<p> + При установке приложения с использованием новой модели разрешений на устройство +под управлением другой версии ОС, отличной от M Preview, +система рассматривает такое приложение как любое другое и предлагает +пользователю предоставить все объявленные разрешения уже во время установки. +</p> + +<p class="note"> + <strong>Примечание.</strong> В случае с предварительной версией в качестве минимальной версии пакета SDK +следует задать версию SDK M Preview, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии. Это означает, +что вы не сможете протестировать такие приложения на старых платформах +во время использования предварительной версии для разработчиков. +</p> + +<h3 id="perms-vs-intents">Разрешения и намерения</h3> + +<p> + Во многих случаях при разработке приложения у вас есть выбор между двумя способами выполнения задачи: + вы можете настроить приложение таким образом, чтобы оно самостоятельно запрашивало соответствующие разрешения на выполнение +операции, или же можно указать ему использовать намерение, чтобы задачу выполнило +другое приложение. +</p> + +<p> + Например, предположим, что вашему приложению требуется возможность делать снимки с помощью камеры устройства. + Ваше приложение может запросить разрешение +<code>android.permission.CAMERA</code>, которое позволит ему напрямую получить доступ +к камере. Затем ваше приложение использует API-интерфейсы камеры +для управления камерой и получения снимков. Благодаря такому подходу ваше приложение получает +полный контроль над процессом фотографирования. Кроме того, это позволяет вам вставить пользовательский интерфейс камеры +в свое приложение. +</p> + +<p> + Если же вам не требуется такой контроль, просто воспользуйтесь намерением {@link +android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} +для запроса изображения. Когда вы запускаете намерение, пользователю предлагается выбрать +приложение камеры (если оно отличается от приложения камеры по умолчанию), после чего +это приложение делает снимок. Приложение камеры возвращает полученное изображение в метод {@link +android.app.Activity#onActivityResult onActivityResult()} вашего приложения. +</p> + +<p> + Аналогичным образом, если вам необходимо позвонить, получить доступ к контактам пользователя и так далее, +можно создать соответствующее намерение или запросить +разрешение и напрямую получить доступ к нужным объектам. У каждого подхода есть +как преимущества, так и недостатки. +</p> + +<p> + При использовании разрешений: +</p> + +<ul> + <li>Ваше приложение получает полный контроль над взаимодействием пользователя с интерфейсом во время выполнения +операции. Однако такой широкий контроль усложняет вашу задачу, +требуя разработать подходящий пользовательский интерфейс. + </li> + + <li>Пользователю предлагается предоставить разрешения только один раз, при первом +выполнении операции. После этого ваше приложение может выполнять операцию без вмешательства +со стороны пользователя. Однако если пользователь не +предоставит разрешение (или отзовет его позже), ваше приложение не сможет выполнить +операцию. + </li> +</ul> + +<p> + При использовании намерений: +</p> + +<ul> + <li>Вам не нужно разрабатывать пользовательский интерфейс для выполнения операции, его предоставляет приложение, которое обрабатывает +намерение. Однако это также означает, что у вас отсутствует контроль над +взаимодействием пользователя с интерфейсом. Возможно, пользователю придется взаимодействовать с +приложением, которое вы даже не видели. + </li> + + <li>Если у пользователя нет приложения по умолчанию для выполнения операции, система +предлагает ему выбрать приложение. Если пользователь не назначит обработчик +по умолчанию, то при каждом выполнении операции для него может +отображаться дополнительное диалоговое окно. + </li> +</ul> + +<h2 id="coding">Добавление в код разрешений на выполнение</h2> + +<p> + Если ваше приложение предназначено для новой версии M Developer Preview, вы должны в обязательном порядке использовать +новую модель разрешений. Это означает, что кроме объявления требуемых разрешений +в манифесте, вам следует проверять наличие этих разрешений +во время выполнения, а также запрашивать их, если у вас +еще нет необходимых разрешений. +</p> + +<h3 id="enabling"> + Активация новой модели разрешений +</h3> + +<p> + Чтобы активировать новую модель разрешений M Developer Preview, задайте для атрибута +<code>targetSdkVersion</code> приложения значение <code>"MNC"</code>, а для атрибута +<code>compileSdkVersion</code> – значение <code>"android-MNC"</code>. Это позволит +включить все функции новой модели разрешений. +</p> + +<p> + В случае с предварительной версией необходимо задать для параметра <code>minSdkVersion</code> значение +<code>"MNC"</code>, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии. +</p> + +<h3 id="m-only-perm"> + Назначение разрешений только для M Preview +</h3> + +<p> + В манифесте приложения можно использовать новый элемент <code><uses-permission-sdk-m></code>, +чтобы указать, что разрешение требуется только для M Developer Preview. Если объявить +разрешение таким способом, то при установке приложения на устройство с более старой версией платформы +система не будет отправлять запрос пользователю или предоставлять разрешение приложению. +С помощью элемента <code><uses-permission-sdk-m></code> +вы можете добавлять новые разрешения +в обновленные версии вашего приложения без принудительного запроса у пользователей разрешений при +установке обновления. +</p> + +<p> + Если приложение запущено на устройстве под управлением M Developer Preview, +поведение элемента <code><uses-permission-sdk-m></code> аналогично поведению +<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>. + Система не запрашивает у пользователей предоставление каких-либо разрешений, когда они устанавливают +приложение. Вместо этого приложение само запрашивает разрешения, когда они требуются. +</p> + +<h3 id="prompting"> + Запрос разрешений +</h3> + +<p> + Если ваше приложение использует новую модель разрешений M Developer Preview, то при первом запуске приложения +на устройстве под управлением +M Preview пользователю не предлагается предоставить все разрешения. Вместо этого приложение само запрашивает разрешения, когда они +требуются. Когда приложение запрашивает разрешение, система отображает для пользователя соответствующее диалоговое +окно. +</p> + +<p> + Если ваше приложение запущено на устройстве с пакетом SDK уровня 22 или более низкого, то приложение использует старую +модель разрешений. То есть при каждой устновке приложения пользователю будет предложено предоставить приложению все разрешения, +запрашиваемые в манифесте приложения, кроме +отмеченных элементом <code><uses-permission-sdk-m></code>. +</p> + +<h4 id="check-platform">Проверка платформы, на которой выполняется приложение</h4> + +<p> + Новая модель разрешений поддерживается только на устройствах под управлением M Developer +Preview. Прежде чем вызывать любые из этих методов, приложению следует проверить, +на какой платформе оно выполняется, +обратившись к значению параметра {@link android.os.Build.VERSION#CODENAME +Build.VERSION.CODENAME}. Если устройство работает под управлением M Developer Preview, +то значение параметра{@link android.os.Build.VERSION#CODENAME CODENAME} будет <code>"MNC"</code>. +</p> + +<h4 id="check-for-permission">Проверка наличия у приложения необходимого разрешения</h4> + +<p>Когда пользователи пытаются выполнить какое-либо действие, для которого требуется разрешение, приложение +проверяет, имеется ли у него в настоящее время разрешение на выполнение этой операции. Для этого +приложение вызывает метод +<code>Context.checkSelfPermission(<i>permission_name</i>)</code>. Приложению +следует выполнять такую проверку даже в том случае, если ему известно, что пользователь уже предоставил +необходимое разрешение, +поскольку пользователь может в любое время отозвать разрешения приложения. Например, если пользователь +хочет получить снимок с помощью приложения, то приложение вызывает метод +<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>.</p> + +<p class="table-caption" id="permission-groups"> + <strong>Таблица 1.</strong> Разрешения и группы разрешений.</p> +<table> + <tr> + <th scope="col">Группа разрешений</th> + <th scope="col">Разрешения</th> + </tr> + + <tr> + <td><code>android.permission-group.CALENDAR</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_CALENDAR</code> + </li> + </ul> + <ul> + <li> + <code>android.permission.WRITE_CALENDAR</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.CAMERA</code></td> + <td> + <ul> + <li> + <code>android.permission.CAMERA</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.CONTACTS</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_CONTACTS</code> + </li> + <li> + <code>android.permission.WRITE_CONTACTS</code> + </li> + <li> + <code>android.permission.READ_PROFILE</code> + </li> + <li> + <code>android.permission.WRITE_PROFILE</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.LOCATION</code></td> + <td> + <ul> + <li> + <code>android.permission.ACCESS_FINE_LOCATION</code> + </li> + <li> + <code>android.permission.ACCESS_COARSE_LOCATION</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.MICROPHONE</code></td> + <td> + <ul> + <li> + <code>android.permission.RECORD_AUDIO</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.PHONE</code></td> + <td> + <ul> + <li> + <code>android.permission.READ_PHONE_STATE</code> + </li> + <li> + <code>android.permission.CALL_PHONE</code> + </li> + <li> + <code>android.permission.READ_CALL_LOG</code> + </li> + <li> + <code>android.permission.WRITE_CALL_LOG</code> + </li> + <li> + <code>com.android.voicemail.permission.ADD_VOICEMAIL</code> + </li> + <li> + <code>android.permission.USE_SIP</code> + </li> + <li> + <code>android.permission.PROCESS_OUTGOING_CALLS</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.SENSORS</code></td> + <td> + <ul> + <li> + <code>android.permission.BODY_SENSORS</code> + </li> + </ul> + <ul> + <li> + <code>android.permission.USE_FINGERPRINT</code> + </li> + </ul> + </td> + </tr> + + <tr> + <td><code>android.permission-group.SMS</code></td> + <td> + <ul> + <li> + <code>android.permission.SEND_SMS</code> + </li> + <li> + <code>android.permission.RECEIVE_SMS</code> + </li> + <li> + <code>android.permission.READ_SMS</code> + </li> + <li> + <code>android.permission.RECEIVE_WAP_PUSH</code> + </li> + <li> + <code>android.permission.RECEIVE_MMS</code> + </li> + <li> + <code>android.permission.READ_CELL_BROADCASTS</code> + </li> + </ul> + </td> + </tr> + +</table> + +<h4 id="request-permissions">Запрос разрешений при необходимости</h4> + +<p>Если у приложения нет требуемого разрешения, оно вызывает метод +<code>Activity.requestPermissions(String[], int)</code>, чтобы запросить его. + Приложение передает в него +требуемые разрешения, а также целочисленный код запроса. + Этот метод выполняется асинхронно: он возвращает результат сразу же, а после того как пользователь +предоставляет ответ в диалоговом окне, система вызывает метод обратного вызова +приложения с результатами и передает в него тот же код запроса, который приложение передало в метод +<code>requestPermissions()</code>.</p> + + <p>Ниже представлен пример кода для проверки наличия у приложения разрешения на чтение контактов +пользователя и запроса соответствующего разрешения при необходимости.</p> + +<pre> +if (checkSelfPermission(Manifest.permission.READ_CONTACTS) + != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, + MY_PERMISSIONS_REQUEST_READ_CONTACTS); + + // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an + // app-defined int constant + + return; +} +</pre> + +<h4 id="handle-response">Обработка ответа на запрос разрешений</h4> + +<p> + Когда приложение запрашивает разрешения, система отображает для пользователя соответствующее диалоговое +окно. После получения ответа от пользователя система вызывает метод +<code>Activity.onRequestPermissionsResult(int, String[], int[])</code> +вашего приложения и передает в него ответ пользователя. Вашему приложению необходимо переопределить этот метод. В обратном +вызове передается тот же код запроса, который вы передали в метод +<code>requestPermissions()</code>. Например, если приложение запрашивает доступ на +<code>READ_CONTACTS</code>, то метод обратного вызова +может быть следующим: +</p> + +<pre> +@Override +public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + + // permission was granted, yay! do the + // calendar task you need to do. + + } else { + + // permission denied, boo! Disable the + // functionality that depends on this permission. + } + return; + } + + // other 'switch' lines to check for other + // permissions this app might request + } +} +</pre> + + <p>Если пользователь предоставляет разрешение, система, в свою очередь, представляет все разрешения, +запрашиваемые в манифесте приложения для обозначенной функциональной области. Если пользователь +отказывает в предоставлении разрешения, вам необходимо принять меры. Например, вы можете отключить любые пункты меню +, для использования которых требуется это разрешение. + </li> +</p> + +<p> + Когда система предлагает пользователю предоставить разрешение, он может указать системе, +чтобы она больше не запрашивала это разрешение. В этом случае, +когда приложение использует метод <code>requestPermissions()</code> для запроса такого разрешения, +система сразу же отклоняет запрос. При этом система вызывает ваш метод +<code>onRequestPermissionsResult()</code> так же, как если бы пользователь повторно +отклонил ваш запрос. Поэтому ваше приложение +не считает, что имело место прямое взаимодействие с пользователем. +</p> + +<h2 id="testing">Тестирование разрешений на выполнение</h2> + + +<p> + Если ваше приложение предназначено для новой версии M Developer Preview, то вы должны протестировать +его и убедиться в том, что оно должным образом обрабатывает разрешения. Не надо исходить из того, что к началу работы ваше приложение уже имеет +любые определенные разрешения. При первом запуске приложения оно, +скорее всего, не будет обладать разрешениями, а в дальнейшем пользователь может в любой момент отозвать или восстановить +разрешения. +</p> + +<p> + Вам следует протестировать ваше приложение и убедиться в том, что оно ведет себя должным образом в +любых ситуациях, касающихся разрешений. Мы включили в состав пакета SDK M Preview SDK новые команды +<a href="{@docRoot}tools/help/adb.html">Android +Debug Bridge (ADB)</a>, чтобы вы могли протестировать ваше приложение с любыми настройками разрешений, +которые вы хотите попробовать в действии. +</p> + +<h3> + Новые команды и параметры ADB +</h3> + +<p> + В состав пакета инструментов SDK M Preview входит ряд новых команд, позволяющих протестировать обработку разрешений +вашим приложением. +</p> + +<h4> + Установка с разрешениями +</h4> + +<p> + Можно воспользоваться новым параметром <code>-g</code> команды <a href="{@docRoot}tools/help/adb.html#move"><code>adb + install</code></a>, который служит для установки +приложения и предоставления всех разрешений, указанных в его манифесте: +</p> + +<pre class="no-pretty-print"> +$ adb install -g <path_to_apk> +</pre> + +<h4> + Предоставление разрешений и их отзыв +</h4> + +<p> + Для предоставления разрешений установленному приложению и их отзыва можно использовать новые команды <a href="{@docRoot}tools/help/adb.html#pm">диспетчера пакетов</a> +ADB. +Такая функциональная возможность может быть полезна для автоматизированного тестирования. +</p> + +<p> + Для представления разрешения используйте команду <code>grant</code> диспетчера пакетов: +</p> + +<pre class="no-pretty-print"> +$ adb pm grant <package_name> <permission_name> +</pre> + +<p> + Например, чтобы представить пакету com.example.myapp разрешение на запись +аудио, воспользуйтесь следующей командой: +</p> + +<pre class="no-pretty-print"> +$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO +</pre> + +<p> + Чтобы отозвать разрешение, используйте команду <code>revoke</code> диспетчера пакетов: +</p> + +<pre class="no-pretty-print"> +$ adb pm revoke <package_name> <permission_name> +</pre> + +<h2 id="best-practices">Советы и рекомендации</h2> + +<p> + Новая модель разрешений делает работу пользователей удобнее, +упрощает для них процесс установки приложений и позволяет лучше понимать, +что делает то или иное приложение. Чтобы использовать все преимущества +этой модели, примите во внимание следующие рекомендации: +</p> + + +<h3 id="bp-what-you-need">Запрашивайте только те разрешения, которые необходимы</h3> + +<p> + Каждый раз, когда вы запрашиваете разрешение, вы заставляете пользователя делать выбор. + Если пользователь отклоняет запрос, соответствующая функциональная возможность приложения отключается. + Вам следует сократить количество таких запросов. +</p> + +<p> + Например, во многих случаях можно предоставить приложению доступ к нужной функции посредством +<a href="{@docRoot}guide/components/intents-filters.html">намерения</a> вместо +запроса разрешений. Если вашему приложению необходимо получить снимки с камеры +телефона, можно использовать намерение {@link +android.provider.MediaStore#ACTION_IMAGE_CAPTURE +MediaStore.ACTION_IMAGE_CAPTURE}. Когда ваше приложение выполняет намерение, система +предлагает пользователю выбрать уже установленное приложение камеры для +получения снимков. +</p> + +<h3 id="bp-dont-overwhelm"> + Не перегружайте пользователя запросами +</h3> + +<p> + Если на пользователя обрушивается сразу много запросов разрешений, он может +решить, что все это слишком сложно, и просто закрыть приложение. Поэтому разрешения следует +запрашивать только тогда, когда это необходимо. +</p> + +<p> + Иногда приложению жизненно необходимы одно или несколько разрешений. +В таких случаях имеет смысл запросить все разрешения +сразу при запуске приложения. Например, если вы разрабатываете приложение для фотографирования, то ему +однозначно потребуется доступ к камере устройства. Когда пользователь в первый раз запускает приложение, +он не удивится, если приложение запросит у него разрешение на +использование камеры. Однако если в этом же приложении имеется функция обмена фотографиями с +контактами пользователя, возможно, <em>не следует</em> запрашивать соответствующее разрешение при +первом запуске приложения. Лучше дождаться, когда пользователю потребуется функция обмена контентом, +и уже тогда запросить разрешение. +</p> + +<p> + Если в вашем приложении имеются обучающие материалы, может оказаться целесообразным запросить необходимые разрешения +после того, как пользователь изучит материалы. +</p> + +<h3 id="bp-explain"> + Всегда поясняйте, для чего требуются те или иные разрешения +</h3> + +<p> + В диалоговом окне запроса разрешений, которое система отображает при вызове вами метода +<code>requestPermissions()</code>, обозначается требуемое для приложения разрешение, +однако не указывается, для чего оно необходимо. В некоторых случаях это может озадачить пользователя. + Поэтому, прежде чем вызывать метод +<code>requestPermissions()</code>, стоит пояснить пользователю, для чего вашему приложению требуются разрешения. +</p> + +<p> + Например, приложению для фотографирования может потребоваться доступ к службам геолокации, чтобы фотографии можно было снабдить +геотегами. Не все пользователи знают, что +фотография может содержать данные о месте съемки, и им может показаться странным, что приложение для фотографирования запрашивает данные +о местоположении. В этом случае полезно +рассказать пользователю о такой возможности, <em>прежде</em> чем вызывать метод +<code>requestPermissions()</code>. +</p> + +<p> + Это можно сделать, в частности, внедрив такие запросы в обучающие материалы приложения. В обучающих +материалах могут содержаться описания каждой из функций приложения с пояснением, +какие разрешения необходимы для их использования. Например, в обучающий материал по работе с приложением для фотографирования +можно включить описание функции обмена контентом с контактами, после чего +пояснить, что для этого пользователю следует предоставить приложению доступ к его контактам. + После этого приложение может вызвать метод <code>requestPermissions()</code> для запроса +доступа. Конечно, не все пользователи обращаются к обучающим материалам, +поэтому вам по-прежнему следует проверять наличие разрешений и при необходимости запрашивать +их во время обычной работы приложения. +</p> |