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&gt;</strong> <i>название_приложения</i> <strong>&gt; Разрешения</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>&lt;uses-permission-sdk-m&gt;</code>,
336чтобы указать, что разрешение требуется только для M Developer Preview. Если объявить
337разрешение таким способом, то при установке приложения на устройство с более старой версией платформы
338система не будет отправлять запрос пользователю или предоставлять разрешение приложению.
339С помощью элемента <code>&lt;uses-permission-sdk-m&gt;</code>
340вы можете добавлять новые разрешения
341в обновленные версии вашего приложения без принудительного запроса у пользователей разрешений при
342установке обновления.
343</p>
344
345<p>
346  Если приложение запущено на устройстве под управлением M Developer Preview,
347поведение элемента <code>&lt;uses-permission-sdk-m&gt;</code> аналогично поведению
348<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</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>&lt;uses-permission-sdk-m&gt;</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&#64;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 &lt;path_to_apk&gt;
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 &lt;package_name&gt; &lt;permission_name&gt;
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 &lt;package_name&gt; &lt;permission_name&gt;
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