summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd
blob: 7d12b2d3efe1a47f881b0d52639df78f92335424 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
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>Приложения
&gt;</strong> <i>название_приложения</i> <strong>&gt; Разрешения</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>&lt;uses-permission-sdk-m&gt;</code>,
чтобы указать, что разрешение требуется только для M Developer Preview. Если объявить
разрешение таким способом, то при установке приложения на устройство с более старой версией платформы
система не будет отправлять запрос пользователю или предоставлять разрешение приложению.
С помощью элемента <code>&lt;uses-permission-sdk-m&gt;</code>
вы можете добавлять новые разрешения
в обновленные версии вашего приложения без принудительного запроса у пользователей разрешений при
установке обновления.
</p>

<p>
  Если приложение запущено на устройстве под управлением M Developer Preview,
поведение элемента <code>&lt;uses-permission-sdk-m&gt;</code> аналогично поведению
<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code>.
  Система не запрашивает у пользователей предоставление каких-либо разрешений, когда они устанавливают
приложение. Вместо этого приложение само запрашивает разрешения, когда они требуются.
</p>

<h3 id="prompting">
  Запрос разрешений
</h3>

<p>
  Если ваше приложение использует новую модель разрешений M Developer Preview, то при первом запуске приложения
на устройстве под управлением
M Preview пользователю не предлагается предоставить все разрешения. Вместо этого приложение само запрашивает разрешения, когда они
требуются. Когда приложение запрашивает разрешение, система отображает для пользователя соответствующее диалоговое
окно.
</p>

<p>
  Если ваше приложение запущено на устройстве с пакетом SDK уровня 22 или более низкого, то приложение использует старую
модель разрешений. То есть при каждой устновке приложения пользователю будет предложено предоставить приложению все разрешения,
запрашиваемые в манифесте приложения, кроме
отмеченных элементом <code>&lt;uses-permission-sdk-m&gt;</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>
&#64;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 &lt;path_to_apk&gt;
</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 &lt;package_name&gt; &lt;permission_name&gt;
</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 &lt;package_name&gt; &lt;permission_name&gt;
</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>