1page.title=Разрешения 2page.tags=previewresources, androidm 3page.keywords=разрешения, среда выполнения, предварительная версия 4page.image={@docRoot}preview/features/images/permissions_check.png 5@jd:body 6 7 8<div id="qv-wrapper"> 9 <div id="qv"> 10 <h2>Краткое описание</h2> 11 <ul> 12 <li>Если ваше приложение предназначено для пакета SDK M Preview, пользователю будет предложено предоставить для него разрешения 13 не в процессе установки, а при работе с приложением.</li> 14 <li>Пользователь также может в любой момент отозвать разрешения, воспользовавшись экраном приложения «Настройки» 15.</li> 16 <li>Ваше приложение должно проверять наличие соответствующих разрешений при каждом запуске. 17</li> 18 </ul> 19 20 <h2>Содержание документа</h2> 21 <ol> 22 <li><a href="#overview">Обзор</a></li> 23 <li><a href="#coding">Добавление в код разрешений на выполнение</a></li> 24 <li><a href="#testing">Тестирование разрешений на выполнение</a></li> 25 <li><a href="#best-practices">Советы и рекомендации</a></li> 26 </ol> 27 28<!-- 29 <h2>Related Samples</h2> 30 <ol> 31 <li></li> 32 </ol> 33--> 34 35<!-- 36 <h2>See also</h2> 37 <ol> 38 <li></li> 39 </ol> 40--> 41 </div> <!-- qv --> 42</div> <!-- qv-wrapper --> 43 44 45<p> 46 В версии M Developer Preview представлена новая модель разрешений для приложений, которая 47оптимизирует для пользователей процесс установки и обновления приложений. Если приложение, 48работающее в M Preview, поддерживает новую модель разрешений, пользователю не нужно предоставлять какие-либо 49разрешения при установке приложения или его обновлении. Вместо этого приложение 50запрашивает разрешения, когда в них возникает необходимость, — в таких случаях система отображает для пользователя диалоговое окно с просьбой предоставить 51соответствующее разрешение. 52</p> 53 54<p> 55 Если приложение поддерживает новую модель разрешений, его, тем не менее, можно установить и 56запустить на устройстве под управлением одной из более ранних версий Android, и оно будет использовать старую модель 57разрешений. 58</p> 59 60<h2 id="overview"> 61 Обзор 62</h2> 63 64<p> 65 В версии M Developer Preview представлена новая 66модель разрешений. Ниже приводится краткий обзор ее ключевых компонентов: 67</p> 68 69<ul> 70 <li> 71 <strong>Объявление разрешений.</strong> Все разрешения, которые требуются 72приложению, объявляются в его манифесте, как и в более ранних версиях платформы Android. 73 </li> 74 75 <li> 76 <strong>Группы разрешений.</strong> Разрешения 77<em>группируются</em> по типу их функциональных возможностей. Например, в группе разрешений 78<code>CONTACTS</code> находятся разрешения на чтение и запись 79контактов пользователя и информации из его профиля. 80 </li> 81 82 <li> 83 <p><strong>Ограниченные разрешения, предоставляемые во время установки.</strong> Когда 84пользователь устанавливает или обновляет приложение, система предоставляет такому приложению все запрашиваемые им 85разрешения, соответствующие константе {@link 86android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}. 87 Например, разрешения для будильника и подключения к Интернету соответствуют константе {@link 88android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}, 89поэтому они предоставляются автоматически во время установки. 90 </p> 91 92 <p>Система также может предоставить приложению подпись и системные разрешения, как описано в разделе 93<a href="#system-apps">Предоставление приложениям системных разрешений и 94подписи</a>. Пользователю <em>не предлагается</em> предоставить какие-либо разрешения 95во время установки.</p> 96 </li> 97 98 <li> 99 <strong>Предоставление пользователем разрешений во время выполнения.</strong> Когда приложение запрашивает разрешение, 100система отображает для пользователя соответствующее диалоговое окно, а затем вызывает функцию обратного вызова приложения 101с целью уведомить его о том, предоставлены ли необходимые разрешения. Если 102пользователь предоставляет разрешение, приложение получает весь набор разрешений в рамках данной функциональной области 103разрешения, который был объявлен в манифесте приложения. 104 </li> 105 106</ul> 107 108<p> 109 Новая модель разрешений влияет на поведение приложений при работе с функциями, для 110которых требуются разрешения. При использовании этой модели в разработке 111 обратите внимание на следующие рекомендации: 112</p> 113 114<ul> 115 116 <li> 117 <strong>Всегда проверяйте наличие разрешений.</strong> Когда приложению необходимо выполнить 118какое-либо действие, для которого требуется разрешение, оно должно сначала проверить, 119имеется ли у него такое разрешение. Если разрешение отсутствует, приложение 120должно запросить его. 121 </li> 122 123 <li> 124 <strong>Если вам не дают разрешения, выходите из положения красиво.</strong> Если у приложения 125нет нужного разрешения, оно должно обработать эту ошибку разумно. 126 Например, если разрешение требуется лишь для необязательной функции, приложение может 127просто отключить ее. Если же приложение не может работать без данного разрешения, 128 оно может отключить все свои функциональные возможности и проинформировать пользователя, 129что для работы ему требуется разрешение. 130 </li> 131 132 <div class="figure" style="width:220px" id="fig-perms-screen"> 133 <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"> 134 <p class="img-caption"> 135 <strong>Рисунок 1.</strong> Экран разрешений в настройках приложения. 136 </p> 137 </div> 138 139 <li> 140 <strong>Разрешения можно отзывать.</strong> Пользователи могут в любое время отозвать разрешения 141приложения. Когда пользователь отзывает разрешения, 142приложение <em>не</em> уведомляется об этом. Снова повторим, что приложение должно всегда проверять наличие 143разрешений, прежде чем выполнять любые действия, для которых они необходимы. 144 </li> 145</ul> 146 147<p class="note"> 148 <strong>Примечание.</strong> Если приложение предназначено для M Developer Preview, оно 149<em>должно в обязательном порядке</em> использовать новую модель разрешений. 150</p> 151 152<p> 153 На момент выпуска M Developer Preview не все приложения Google в полной мере реализуют 154 новую модель разрешений. Google обновляет эти приложения 155по мере разработки M Developer Preview, чтобы они должным образом поддерживали настройки 156разрешений. 157</p> 158 159<p class="note"> 160 <strong>Примечание.</strong> Если у вашего приложения имеется собственная поверхность API-интерфейса, прежде чем проксировать 161разрешения, убедитесь сначала в том, что у вызывающей операции имеются надлежащие 162разрешения на доступ к данным. 163</p> 164 165<h3 id="system-apps"> 166 Предоставление приложениям системных разрешений и подписи 167</h3> 168 169<p> 170 Как правило, когда пользователь устанавливает приложение, система предоставляет такому приложению только те 171разрешения, которые соответствуют константе {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL 172PROTECTION_NORMAL}. Однако в определенных ситуациях система предоставляет 173приложению больше разрешений: 174</p> 175 176<ul> 177 <li>если приложение является частью системного образа, ему автоматически предоставляются все 178разрешения, обозначенные в его манифесте; 179 </li> 180 181 <li>если в манифесте приложения запрашиваются разрешения, соответствующие константе {@link 182android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE}, 183а для подписи приложения использовался то же сертификат, что и для приложения, 184объявившего эти разрешения, система предоставляет запрашивающему приложению необходимые разрешения при 185установке. 186 </li> 187</ul> 188 189<p> 190 В обоих случаях пользователь по-прежнему может в любое время отозвать разрешения, обратившись к 191экрану <strong>Настройки</strong> и выбрав <strong>Приложения 192></strong> <i>название_приложения</i> <strong>> Разрешения</strong>. Поэтому приложение все равноу 193должно проверять наличие разрешений во время выполнения и при необходимости запрашивать их. 194 195</p> 196 197<h3 id="compatibility"> 198 Совместимость с предыдущими и последующими версиями 199</h3> 200 201<p> 202 Если приложение не предназначено для M Developer Preview, оно 203продолжает использовать старую модель разрешений даже на устройствах под управлением M Preview. В таком случае при установке приложения 204 система предлагает пользователю предоставить все разрешения, 205указанные в манифесте приложения. 206</p> 207 208<p class="note"> 209 <strong>Примечание.</strong> На устройствах под управлением M Developer Preview пользователь может отключить 210разрешения для любого приложения (включая устаревшие приложения) на экране «Настройки». 211 Если пользователь решит отключить разрешения для устаревших приложений, система 212автоматически отключит соответствующие функциональные возможности. Когда приложение пытается 213выполнить операцию, для которой требуется такое разрешение, это 214не обязательно приведет к возникновению исключения. Вместо этого оно может выдать пустой набор данных, 215сигнал об ошибке или иным образом обозначить непредвиденное поведение. Например, если запросить 216календарь, не имея соответствующего разрешения, метод возвратит пустой набор данных. 217</p> 218 219<p> 220 При установке приложения с использованием новой модели разрешений на устройство 221под управлением другой версии ОС, отличной от M Preview, 222система рассматривает такое приложение как любое другое и предлагает 223пользователю предоставить все объявленные разрешения уже во время установки. 224</p> 225 226<p class="note"> 227 <strong>Примечание.</strong> В случае с предварительной версией в качестве минимальной версии пакета SDK 228следует задать версию SDK M Preview, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии. Это означает, 229что вы не сможете протестировать такие приложения на старых платформах 230во время использования предварительной версии для разработчиков. 231</p> 232 233<h3 id="perms-vs-intents">Разрешения и намерения</h3> 234 235<p> 236 Во многих случаях при разработке приложения у вас есть выбор между двумя способами выполнения задачи: 237 вы можете настроить приложение таким образом, чтобы оно самостоятельно запрашивало соответствующие разрешения на выполнение 238операции, или же можно указать ему использовать намерение, чтобы задачу выполнило 239другое приложение. 240</p> 241 242<p> 243 Например, предположим, что вашему приложению требуется возможность делать снимки с помощью камеры устройства. 244 Ваше приложение может запросить разрешение 245<code>android.permission.CAMERA</code>, которое позволит ему напрямую получить доступ 246к камере. Затем ваше приложение использует API-интерфейсы камеры 247для управления камерой и получения снимков. Благодаря такому подходу ваше приложение получает 248полный контроль над процессом фотографирования. Кроме того, это позволяет вам вставить пользовательский интерфейс камеры 249в свое приложение. 250</p> 251 252<p> 253 Если же вам не требуется такой контроль, просто воспользуйтесь намерением {@link 254android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 255для запроса изображения. Когда вы запускаете намерение, пользователю предлагается выбрать 256приложение камеры (если оно отличается от приложения камеры по умолчанию), после чего 257это приложение делает снимок. Приложение камеры возвращает полученное изображение в метод {@link 258android.app.Activity#onActivityResult onActivityResult()} вашего приложения. 259</p> 260 261<p> 262 Аналогичным образом, если вам необходимо позвонить, получить доступ к контактам пользователя и так далее, 263можно создать соответствующее намерение или запросить 264разрешение и напрямую получить доступ к нужным объектам. У каждого подхода есть 265как преимущества, так и недостатки. 266</p> 267 268<p> 269 При использовании разрешений: 270</p> 271 272<ul> 273 <li>Ваше приложение получает полный контроль над взаимодействием пользователя с интерфейсом во время выполнения 274операции. Однако такой широкий контроль усложняет вашу задачу, 275требуя разработать подходящий пользовательский интерфейс. 276 </li> 277 278 <li>Пользователю предлагается предоставить разрешения только один раз, при первом 279выполнении операции. После этого ваше приложение может выполнять операцию без вмешательства 280со стороны пользователя. Однако если пользователь не 281предоставит разрешение (или отзовет его позже), ваше приложение не сможет выполнить 282операцию. 283 </li> 284</ul> 285 286<p> 287 При использовании намерений: 288</p> 289 290<ul> 291 <li>Вам не нужно разрабатывать пользовательский интерфейс для выполнения операции, его предоставляет приложение, которое обрабатывает 292намерение. Однако это также означает, что у вас отсутствует контроль над 293взаимодействием пользователя с интерфейсом. Возможно, пользователю придется взаимодействовать с 294приложением, которое вы даже не видели. 295 </li> 296 297 <li>Если у пользователя нет приложения по умолчанию для выполнения операции, система 298предлагает ему выбрать приложение. Если пользователь не назначит обработчик 299по умолчанию, то при каждом выполнении операции для него может 300отображаться дополнительное диалоговое окно. 301 </li> 302</ul> 303 304<h2 id="coding">Добавление в код разрешений на выполнение</h2> 305 306<p> 307 Если ваше приложение предназначено для новой версии M Developer Preview, вы должны в обязательном порядке использовать 308новую модель разрешений. Это означает, что кроме объявления требуемых разрешений 309в манифесте, вам следует проверять наличие этих разрешений 310во время выполнения, а также запрашивать их, если у вас 311еще нет необходимых разрешений. 312</p> 313 314<h3 id="enabling"> 315 Активация новой модели разрешений 316</h3> 317 318<p> 319 Чтобы активировать новую модель разрешений M Developer Preview, задайте для атрибута 320<code>targetSdkVersion</code> приложения значение <code>"MNC"</code>, а для атрибута 321<code>compileSdkVersion</code> – значение <code>"android-MNC"</code>. Это позволит 322включить все функции новой модели разрешений. 323</p> 324 325<p> 326 В случае с предварительной версией необходимо задать для параметра <code>minSdkVersion</code> значение 327<code>"MNC"</code>, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии. 328</p> 329 330<h3 id="m-only-perm"> 331 Назначение разрешений только для M Preview 332</h3> 333 334<p> 335 В манифесте приложения можно использовать новый элемент <code><uses-permission-sdk-m></code>, 336чтобы указать, что разрешение требуется только для M Developer Preview. Если объявить 337разрешение таким способом, то при установке приложения на устройство с более старой версией платформы 338система не будет отправлять запрос пользователю или предоставлять разрешение приложению. 339С помощью элемента <code><uses-permission-sdk-m></code> 340вы можете добавлять новые разрешения 341в обновленные версии вашего приложения без принудительного запроса у пользователей разрешений при 342установке обновления. 343</p> 344 345<p> 346 Если приложение запущено на устройстве под управлением M Developer Preview, 347поведение элемента <code><uses-permission-sdk-m></code> аналогично поведению 348<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>. 349 Система не запрашивает у пользователей предоставление каких-либо разрешений, когда они устанавливают 350приложение. Вместо этого приложение само запрашивает разрешения, когда они требуются. 351</p> 352 353<h3 id="prompting"> 354 Запрос разрешений 355</h3> 356 357<p> 358 Если ваше приложение использует новую модель разрешений M Developer Preview, то при первом запуске приложения 359на устройстве под управлением 360M Preview пользователю не предлагается предоставить все разрешения. Вместо этого приложение само запрашивает разрешения, когда они 361требуются. Когда приложение запрашивает разрешение, система отображает для пользователя соответствующее диалоговое 362окно. 363</p> 364 365<p> 366 Если ваше приложение запущено на устройстве с пакетом SDK уровня 22 или более низкого, то приложение использует старую 367модель разрешений. То есть при каждой устновке приложения пользователю будет предложено предоставить приложению все разрешения, 368запрашиваемые в манифесте приложения, кроме 369отмеченных элементом <code><uses-permission-sdk-m></code>. 370</p> 371 372<h4 id="check-platform">Проверка платформы, на которой выполняется приложение</h4> 373 374<p> 375 Новая модель разрешений поддерживается только на устройствах под управлением M Developer 376Preview. Прежде чем вызывать любые из этих методов, приложению следует проверить, 377на какой платформе оно выполняется, 378обратившись к значению параметра {@link android.os.Build.VERSION#CODENAME 379Build.VERSION.CODENAME}. Если устройство работает под управлением M Developer Preview, 380то значение параметра{@link android.os.Build.VERSION#CODENAME CODENAME} будет <code>"MNC"</code>. 381</p> 382 383<h4 id="check-for-permission">Проверка наличия у приложения необходимого разрешения</h4> 384 385<p>Когда пользователи пытаются выполнить какое-либо действие, для которого требуется разрешение, приложение 386проверяет, имеется ли у него в настоящее время разрешение на выполнение этой операции. Для этого 387приложение вызывает метод 388<code>Context.checkSelfPermission(<i>permission_name</i>)</code>. Приложению 389следует выполнять такую проверку даже в том случае, если ему известно, что пользователь уже предоставил 390необходимое разрешение, 391поскольку пользователь может в любое время отозвать разрешения приложения. Например, если пользователь 392хочет получить снимок с помощью приложения, то приложение вызывает метод 393<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>.</p> 394 395<p class="table-caption" id="permission-groups"> 396 <strong>Таблица 1.</strong> Разрешения и группы разрешений.</p> 397<table> 398 <tr> 399 <th scope="col">Группа разрешений</th> 400 <th scope="col">Разрешения</th> 401 </tr> 402 403 <tr> 404 <td><code>android.permission-group.CALENDAR</code></td> 405 <td> 406 <ul> 407 <li> 408 <code>android.permission.READ_CALENDAR</code> 409 </li> 410 </ul> 411 <ul> 412 <li> 413 <code>android.permission.WRITE_CALENDAR</code> 414 </li> 415 </ul> 416 </td> 417 </tr> 418 419 <tr> 420 <td><code>android.permission-group.CAMERA</code></td> 421 <td> 422 <ul> 423 <li> 424 <code>android.permission.CAMERA</code> 425 </li> 426 </ul> 427 </td> 428 </tr> 429 430 <tr> 431 <td><code>android.permission-group.CONTACTS</code></td> 432 <td> 433 <ul> 434 <li> 435 <code>android.permission.READ_CONTACTS</code> 436 </li> 437 <li> 438 <code>android.permission.WRITE_CONTACTS</code> 439 </li> 440 <li> 441 <code>android.permission.READ_PROFILE</code> 442 </li> 443 <li> 444 <code>android.permission.WRITE_PROFILE</code> 445 </li> 446 </ul> 447 </td> 448 </tr> 449 450 <tr> 451 <td><code>android.permission-group.LOCATION</code></td> 452 <td> 453 <ul> 454 <li> 455 <code>android.permission.ACCESS_FINE_LOCATION</code> 456 </li> 457 <li> 458 <code>android.permission.ACCESS_COARSE_LOCATION</code> 459 </li> 460 </ul> 461 </td> 462 </tr> 463 464 <tr> 465 <td><code>android.permission-group.MICROPHONE</code></td> 466 <td> 467 <ul> 468 <li> 469 <code>android.permission.RECORD_AUDIO</code> 470 </li> 471 </ul> 472 </td> 473 </tr> 474 475 <tr> 476 <td><code>android.permission-group.PHONE</code></td> 477 <td> 478 <ul> 479 <li> 480 <code>android.permission.READ_PHONE_STATE</code> 481 </li> 482 <li> 483 <code>android.permission.CALL_PHONE</code> 484 </li> 485 <li> 486 <code>android.permission.READ_CALL_LOG</code> 487 </li> 488 <li> 489 <code>android.permission.WRITE_CALL_LOG</code> 490 </li> 491 <li> 492 <code>com.android.voicemail.permission.ADD_VOICEMAIL</code> 493 </li> 494 <li> 495 <code>android.permission.USE_SIP</code> 496 </li> 497 <li> 498 <code>android.permission.PROCESS_OUTGOING_CALLS</code> 499 </li> 500 </ul> 501 </td> 502 </tr> 503 504 <tr> 505 <td><code>android.permission-group.SENSORS</code></td> 506 <td> 507 <ul> 508 <li> 509 <code>android.permission.BODY_SENSORS</code> 510 </li> 511 </ul> 512 <ul> 513 <li> 514 <code>android.permission.USE_FINGERPRINT</code> 515 </li> 516 </ul> 517 </td> 518 </tr> 519 520 <tr> 521 <td><code>android.permission-group.SMS</code></td> 522 <td> 523 <ul> 524 <li> 525 <code>android.permission.SEND_SMS</code> 526 </li> 527 <li> 528 <code>android.permission.RECEIVE_SMS</code> 529 </li> 530 <li> 531 <code>android.permission.READ_SMS</code> 532 </li> 533 <li> 534 <code>android.permission.RECEIVE_WAP_PUSH</code> 535 </li> 536 <li> 537 <code>android.permission.RECEIVE_MMS</code> 538 </li> 539 <li> 540 <code>android.permission.READ_CELL_BROADCASTS</code> 541 </li> 542 </ul> 543 </td> 544 </tr> 545 546</table> 547 548<h4 id="request-permissions">Запрос разрешений при необходимости</h4> 549 550<p>Если у приложения нет требуемого разрешения, оно вызывает метод 551<code>Activity.requestPermissions(String[], int)</code>, чтобы запросить его. 552 Приложение передает в него 553требуемые разрешения, а также целочисленный код запроса. 554 Этот метод выполняется асинхронно: он возвращает результат сразу же, а после того как пользователь 555предоставляет ответ в диалоговом окне, система вызывает метод обратного вызова 556приложения с результатами и передает в него тот же код запроса, который приложение передало в метод 557<code>requestPermissions()</code>.</p> 558 559 <p>Ниже представлен пример кода для проверки наличия у приложения разрешения на чтение контактов 560пользователя и запроса соответствующего разрешения при необходимости.</p> 561 562<pre> 563if (checkSelfPermission(Manifest.permission.READ_CONTACTS) 564 != PackageManager.PERMISSION_GRANTED) { 565 requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 566 MY_PERMISSIONS_REQUEST_READ_CONTACTS); 567 568 // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 569 // app-defined int constant 570 571 return; 572} 573</pre> 574 575<h4 id="handle-response">Обработка ответа на запрос разрешений</h4> 576 577<p> 578 Когда приложение запрашивает разрешения, система отображает для пользователя соответствующее диалоговое 579окно. После получения ответа от пользователя система вызывает метод 580<code>Activity.onRequestPermissionsResult(int, String[], int[])</code> 581вашего приложения и передает в него ответ пользователя. Вашему приложению необходимо переопределить этот метод. В обратном 582вызове передается тот же код запроса, который вы передали в метод 583<code>requestPermissions()</code>. Например, если приложение запрашивает доступ на 584<code>READ_CONTACTS</code>, то метод обратного вызова 585может быть следующим: 586</p> 587 588<pre> 589@Override 590public void onRequestPermissionsResult(int requestCode, 591 String permissions[], int[] grantResults) { 592 switch (requestCode) { 593 case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 594 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 595 596 // permission was granted, yay! do the 597 // calendar task you need to do. 598 599 } else { 600 601 // permission denied, boo! Disable the 602 // functionality that depends on this permission. 603 } 604 return; 605 } 606 607 // other 'switch' lines to check for other 608 // permissions this app might request 609 } 610} 611</pre> 612 613 <p>Если пользователь предоставляет разрешение, система, в свою очередь, представляет все разрешения, 614запрашиваемые в манифесте приложения для обозначенной функциональной области. Если пользователь 615отказывает в предоставлении разрешения, вам необходимо принять меры. Например, вы можете отключить любые пункты меню 616, для использования которых требуется это разрешение. 617 </li> 618</p> 619 620<p> 621 Когда система предлагает пользователю предоставить разрешение, он может указать системе, 622чтобы она больше не запрашивала это разрешение. В этом случае, 623когда приложение использует метод <code>requestPermissions()</code> для запроса такого разрешения, 624система сразу же отклоняет запрос. При этом система вызывает ваш метод 625<code>onRequestPermissionsResult()</code> так же, как если бы пользователь повторно 626отклонил ваш запрос. Поэтому ваше приложение 627не считает, что имело место прямое взаимодействие с пользователем. 628</p> 629 630<h2 id="testing">Тестирование разрешений на выполнение</h2> 631 632 633<p> 634 Если ваше приложение предназначено для новой версии M Developer Preview, то вы должны протестировать 635его и убедиться в том, что оно должным образом обрабатывает разрешения. Не надо исходить из того, что к началу работы ваше приложение уже имеет 636любые определенные разрешения. При первом запуске приложения оно, 637скорее всего, не будет обладать разрешениями, а в дальнейшем пользователь может в любой момент отозвать или восстановить 638разрешения. 639</p> 640 641<p> 642 Вам следует протестировать ваше приложение и убедиться в том, что оно ведет себя должным образом в 643любых ситуациях, касающихся разрешений. Мы включили в состав пакета SDK M Preview SDK новые команды 644<a href="{@docRoot}tools/help/adb.html">Android 645Debug Bridge (ADB)</a>, чтобы вы могли протестировать ваше приложение с любыми настройками разрешений, 646которые вы хотите попробовать в действии. 647</p> 648 649<h3> 650 Новые команды и параметры ADB 651</h3> 652 653<p> 654 В состав пакета инструментов SDK M Preview входит ряд новых команд, позволяющих протестировать обработку разрешений 655вашим приложением. 656</p> 657 658<h4> 659 Установка с разрешениями 660</h4> 661 662<p> 663 Можно воспользоваться новым параметром <code>-g</code> команды <a href="{@docRoot}tools/help/adb.html#move"><code>adb 664 install</code></a>, который служит для установки 665приложения и предоставления всех разрешений, указанных в его манифесте: 666</p> 667 668<pre class="no-pretty-print"> 669$ adb install -g <path_to_apk> 670</pre> 671 672<h4> 673 Предоставление разрешений и их отзыв 674</h4> 675 676<p> 677 Для предоставления разрешений установленному приложению и их отзыва можно использовать новые команды <a href="{@docRoot}tools/help/adb.html#pm">диспетчера пакетов</a> 678ADB. 679Такая функциональная возможность может быть полезна для автоматизированного тестирования. 680</p> 681 682<p> 683 Для представления разрешения используйте команду <code>grant</code> диспетчера пакетов: 684</p> 685 686<pre class="no-pretty-print"> 687$ adb pm grant <package_name> <permission_name> 688</pre> 689 690<p> 691 Например, чтобы представить пакету com.example.myapp разрешение на запись 692аудио, воспользуйтесь следующей командой: 693</p> 694 695<pre class="no-pretty-print"> 696$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO 697</pre> 698 699<p> 700 Чтобы отозвать разрешение, используйте команду <code>revoke</code> диспетчера пакетов: 701</p> 702 703<pre class="no-pretty-print"> 704$ adb pm revoke <package_name> <permission_name> 705</pre> 706 707<h2 id="best-practices">Советы и рекомендации</h2> 708 709<p> 710 Новая модель разрешений делает работу пользователей удобнее, 711упрощает для них процесс установки приложений и позволяет лучше понимать, 712что делает то или иное приложение. Чтобы использовать все преимущества 713этой модели, примите во внимание следующие рекомендации: 714</p> 715 716 717<h3 id="bp-what-you-need">Запрашивайте только те разрешения, которые необходимы</h3> 718 719<p> 720 Каждый раз, когда вы запрашиваете разрешение, вы заставляете пользователя делать выбор. 721 Если пользователь отклоняет запрос, соответствующая функциональная возможность приложения отключается. 722 Вам следует сократить количество таких запросов. 723</p> 724 725<p> 726 Например, во многих случаях можно предоставить приложению доступ к нужной функции посредством 727<a href="{@docRoot}guide/components/intents-filters.html">намерения</a> вместо 728запроса разрешений. Если вашему приложению необходимо получить снимки с камеры 729телефона, можно использовать намерение {@link 730android.provider.MediaStore#ACTION_IMAGE_CAPTURE 731MediaStore.ACTION_IMAGE_CAPTURE}. Когда ваше приложение выполняет намерение, система 732предлагает пользователю выбрать уже установленное приложение камеры для 733получения снимков. 734</p> 735 736<h3 id="bp-dont-overwhelm"> 737 Не перегружайте пользователя запросами 738</h3> 739 740<p> 741 Если на пользователя обрушивается сразу много запросов разрешений, он может 742решить, что все это слишком сложно, и просто закрыть приложение. Поэтому разрешения следует 743запрашивать только тогда, когда это необходимо. 744</p> 745 746<p> 747 Иногда приложению жизненно необходимы одно или несколько разрешений. 748В таких случаях имеет смысл запросить все разрешения 749сразу при запуске приложения. Например, если вы разрабатываете приложение для фотографирования, то ему 750однозначно потребуется доступ к камере устройства. Когда пользователь в первый раз запускает приложение, 751он не удивится, если приложение запросит у него разрешение на 752использование камеры. Однако если в этом же приложении имеется функция обмена фотографиями с 753контактами пользователя, возможно, <em>не следует</em> запрашивать соответствующее разрешение при 754первом запуске приложения. Лучше дождаться, когда пользователю потребуется функция обмена контентом, 755и уже тогда запросить разрешение. 756</p> 757 758<p> 759 Если в вашем приложении имеются обучающие материалы, может оказаться целесообразным запросить необходимые разрешения 760после того, как пользователь изучит материалы. 761</p> 762 763<h3 id="bp-explain"> 764 Всегда поясняйте, для чего требуются те или иные разрешения 765</h3> 766 767<p> 768 В диалоговом окне запроса разрешений, которое система отображает при вызове вами метода 769<code>requestPermissions()</code>, обозначается требуемое для приложения разрешение, 770однако не указывается, для чего оно необходимо. В некоторых случаях это может озадачить пользователя. 771 Поэтому, прежде чем вызывать метод 772<code>requestPermissions()</code>, стоит пояснить пользователю, для чего вашему приложению требуются разрешения. 773</p> 774 775<p> 776 Например, приложению для фотографирования может потребоваться доступ к службам геолокации, чтобы фотографии можно было снабдить 777геотегами. Не все пользователи знают, что 778фотография может содержать данные о месте съемки, и им может показаться странным, что приложение для фотографирования запрашивает данные 779о местоположении. В этом случае полезно 780рассказать пользователю о такой возможности, <em>прежде</em> чем вызывать метод 781<code>requestPermissions()</code>. 782</p> 783 784<p> 785 Это можно сделать, в частности, внедрив такие запросы в обучающие материалы приложения. В обучающих 786материалах могут содержаться описания каждой из функций приложения с пояснением, 787какие разрешения необходимы для их использования. Например, в обучающий материал по работе с приложением для фотографирования 788можно включить описание функции обмена контентом с контактами, после чего 789пояснить, что для этого пользователю следует предоставить приложению доступ к его контактам. 790 После этого приложение может вызвать метод <code>requestPermissions()</code> для запроса 791доступа. Конечно, не все пользователи обращаются к обучающим материалам, 792поэтому вам по-прежнему следует проверять наличие разрешений и при необходимости запрашивать 793их во время обычной работы приложения. 794</p> 795