• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>アプリのターゲットが M Preview SDK の場合、インストール時ではなく実行時に、パーミッションを付与するようユーザーに求めます。
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 では、アプリをインストールしてアップグレードするユーザーのプロセスを効率化する新しいアプリのパーミッション モデルが導入されました。
47M Preview で実行しているアプリで新しいパーミッション モデルがサポートされている場合、ユーザーはアプリをインストールまたはアップグレードするときにパーミッションを付与する必要はありません。その代わりに、アプリは必要になるとパーミッションを要求し、パーミッションを確認するよう求めるダイアログが表示されます。
48
49
50
51
52</p>
53
54<p>
55  アプリで新しいパーミッション モデルがサポートされている場合、以前のバージョンの Android を実行している端末で、以前のパーミッション モデルを使ってインストールして実行することもできます。
56
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> アプリは、以前の Android プラットフォームと同様に、マニフェストで必要なすべてのパーミッションを宣言します。
72
73  </li>
74
75  <li>
76    <strong>パーミッション グループ:</strong> パーミッションは、その機能に基づいて<em>パーミッション グループ</em>に分けられます。
77たとえば、<code>CONTACTS</code> パーミッション グループにはユーザーの連絡先とプロフィール情報を読み書きするパーミッションが含まれます。
78
79
80  </li>
81
82  <li>
83    <p><strong>インストール時に付与される制限付きのパーミッション:</strong> ユーザーがアプリをインストールまたはアップデートするとき、{@link
84    android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} に該当する、アプリが要求するすべてのパーミッションがアプリに付与されます。
85
86
87    たとえば、目覚まし時計とインターネットのパーミッションは {@link
88    android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} に該当するため、インストール時に自動的にそれらのパーミッションが付与されます。
89
90    </p>
91
92    <p>システムは、<a href="#system-apps">システムアプリと署名のパーミッション</a>に記載のとおり、アプリの署名とシステムのパーミッションも付与することがあります。
93
94ユーザーは、インストール時にパーミッションを付与するように促すメッセージは表示<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アプリのパーミッションをオフにすると、アプリに通知<em>されません</em>。
142アプリは制限されたアクションを実行する前に、必要なパーミッションがあることを確認する必要があります。
143
144  </li>
145</ul>
146
147<p class="note">
148  <strong>注:</strong> アプリのターゲットが M Developer Preview の場合、新しいパーミッション モデルを使う<em>必要があります</em>。
149
150</p>
151
152<p>
153  M Developer Preview のローンチ時点では、すべての Google アプリで新しいパーミッション モデルが完全に実装されているわけではありません。
154Google はこれらのアプリを M Developer Preview 中にアップデートして、パーミッションの切り替え設定を完全に実装します。
155
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
172  PROTECTION_NORMAL} のみを付与します。ただし、特定の環境では、アプリにより多くのパーミッションが付与されます。
173
174</p>
175
176<ul>
177  <li>アプリがシステム イメージの一部である場合、そのマニフェストにリストされているすべてのパーミッションが自動的に付与されます。
178
179  </li>
180
181  <li>アプリが {@link
182  android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} に該当するマニフェストでパーミッションを要求し、アプリがこれらのパーミッションを宣言したアプリと同じ証明書で署名される場合、要求しているアプリに対してこれらのパーミッションがインストール時に付与されます。
183
184
185
186  </li>
187</ul>
188
189<p>
190
191
192どちらの場合でも、ユーザーはシステムの [<strong>設定</strong>] 画面に移動して [<strong>アプリ</strong>] &gt;  <i>[app_name]</i> &gt; [<strong>パーミッション</strong>] を選ぶと、いつでもパーミッションを取り消すことができます。アプリは実行時にパーミッションを継続して確認し、必要に応じて要求する必要があります。
193
194
195</p>
196
197<h3 id="compatibility">
198  上方互換と下方互換
199</h3>
200
201<p>
202  アプリのターゲットが M Developer Preview 以外の場合、M Preview 端末でも以前のパーミッション モデルを引き続き使います。
203ユーザーがアプリをインストールするとき、ユーザーはアプリのマニフェストでリストされているすべてのパーミッションを付与するように要求されます。
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  M Preview を実行していない端末で新しいパーミッション モデルを使ってアプリをインストールする場合、他のすべてのアプリと同様に扱われ、インストール時に、すべての宣言されたパーミッションを付与するようユーザーに求めます。
221
222
223
224</p>
225
226<p class="note">
227  <strong>注:</strong> Preview リリースの場合、M Preview SDK に SDK の最小バージョンを設定して Preview SDK でコンパイルする必要があります。
228つまり、Developer Preview 中は従来のプラットフォームでそのようなアプリをテストできません。
229
230
231</p>
232
233<h3 id="perms-vs-intents">パーミッションとインテント</h3>
234
235<p>
236  多くの場合、アプリがタスクを実行するには 2 つの方法から選択できます。
237アプリ自体が操作を実行するパーミッションを要求できます。
238アプリでインテントを使うようにして、別のアプリがそのタスクを実行するようにすることもできます。
239
240</p>
241
242<p>
243  たとえば、端末のカメラで写真を撮る機能がアプリに必要だとします。
244アプリは <code>android.permission.CAMERA</code> パーミッションをリクエストでき、それによりアプリが直接カメラにアクセスできるようになります。
245
246そのとき、アプリはカメラの API を使ってカメラを制御し、写真を撮ります。
247このアプローチにより、アプリが写真のプロセスを完全に制御し、カメラの UI をアプリに組み込むことができます。
248
249
250</p>
251
252<p>
253  ただし、そのような制御が不要な場合は、{@link
254  android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} インテントを使うだけで画像を要求できます。
255インテントを開始すると、カメラアプリ(デフォルトのカメラアプリがない場合)を選んでアプリで写真を撮るよう求めるメッセージが表示されます。
256
257カメラアプリはアプリの {@link
258  android.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ただし、そのような幅広い制御により、適切な UI を設計する必要があるため、タスクが複雑化します。
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>操作用に UI を設計する必要はありません。インテントを処理するアプリでは UI が提供されますが、これはユーザーの操作感を制御できないことを意味します。
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 パーミッション モデルを有効にするには、アプリの <code>targetSdkVersion</code> 属性を <code>"MNC"</code> に、<code>compileSdkVersion</code> を <code>"android-MNC"</code> に設定します。
320
321このように設定することで、新しいパーミッション機能すべてが有効になります。
322
323</p>
324
325<p>
326  Preview リリースの場合、<code>minSdkVersion</code> を <code>"MNC"</code> に設定して Preview SDK でコンパイルする必要があります。
327
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> 要素を使って、M Developer Preview のみで必要なパーミッションを表示できます。
336このようにしてパーミッションを宣言すると、アプリを以前の端末にインストールする場合はユーザーにメッセージが表示されないか、アプリにパーミッションが付与されません。<code>&lt;uses-permission-sdk-m&gt;</code> 要素を使うと、新しいパーミッションを追加してインストールをアップデートするときにパーミッションの付与を強制せずにアプリのバージョンがアップデートされます。
337
338
339
340
341
342
343</p>
344
345<p>
346  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> と同じように動作します。
347
348
349  アプリをインストールするとき、パーミッションの付与を求めるメッセージは表示されず、アプリは必要なときにパーミッションを要求します。
350
351</p>
352
353<h3 id="prompting">
354  パーミッションについてのダイアログを表示する
355</h3>
356
357<p>
358  アプリで新しい M Developer Preview パーミッション モデルが使われている場合、M Preview を実行している端末でアプリを初めて起動するとき、すべての権限を付与する必要はありません。
359
360その代わりに、アプリは必要なときにパーミッションを要求します。
361アプリがパーミッションを要求すると、ユーザーにダイアログが表示されます。
362
363</p>
364
365<p>
366  SDK 22 以降がインストールされた端末でアプリを実行する場合、アプリでは以前のパーミッション モデルが使われます。
367ユーザーがアプリをインストールすると、アプリがそのマニフェストで要求するすべてのパーミッションの付与を求めるメッセージが表示されます。ただし、<code>&lt;uses-permission-sdk-m&gt;</code> というラベルの付いたパーミッションは例外です。
368
369
370</p>
371
372<h4 id="check-platform">アプリが実行されているプラットフォームを確認する</h4>
373
374<p>
375  このパーミッション モデルは、M Developer Preview を実行している端末でのみサポートされます。
376これらのメソッドのいずれかを呼び出す前に、アプリは {@link android.os.Build.VERSION#CODENAME
377  Build.VERSION.CODENAME} の値を確認してどのプラットフォーム上で実行されているのかを確認する必要があります。
378
379端末で M Developer Preview が実行されている場合、{@link android.os.Build.VERSION#CODENAME CODENAME} は <code>"MNC"</code> です。
380
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たとえば、ユーザーがアプリを使って写真を撮る場合、アプリは <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code> を呼び出します。
392
393</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>アプリに必要なパーミッションがない場合、アプリは <code>Activity.requestPermissions(String[], int)</code> メソッドを呼び出して適切なパーミッションを要求します。
551
552アプリは必要なパーミッションと整数の「要求コード」を渡します。
553
554  このメソッドは非同期に機能します。このメソッドはすぐに返され、ユーザーがダイアログ ボックスに応答した後、システムはその結果と一緒にアプリのコールバック メソッドを呼び出し、アプリが <code>requestPermissions()</code> に渡すのと同じ「要求コード」を渡します。
555
556
557</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ユーザーが応答すると、システムはアプリの <code>Activity.onRequestPermissionsResult(int, String[], int[])</code> を呼び出し、ユーザーの応答を渡します。
580
581アプリはそのメソッドをオーバーライドする必要があります。コールバックには開発者が <code>requestPermissions()</code> に渡したのと同じ要求コードが渡されます。
582
583たとえばアプリが <code>READ_CONTACTS</code> アクセスを要求する場合、次のコールバック メソッドが含まれる可能性があります。
584
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この場合、アプリが <code>requestPermissions()</code> を使ってパーミッションを確認すると、システムはその要求をすぐに拒否します。
623
624この場合、システムはユーザーが要求を再度明示的に拒否する場合と同様に <code>onRequestPermissionsResult()</code> を呼び出します。
625
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  アプリがすべてのパーミッションの状況下で確実に正しく動作することをテストしてください。
643M Preview SDK とともに、新しい <a href="{@docRoot}tools/help/adb.html">Android デバッグ ブリッジ(adb)</a>コマンドが導入され、試す必要のあるあらゆるパーミッション設定でアプリをテストできます。
644
645
646
647</p>
648
649<h3>
650  新しい adb コマンドとオプション
651</h3>
652
653<p>
654  M Preview SDK Platform-tools では、アプリがパーミッションをどう処理するかをテストするための、いくつかの新しいコマンドが導入されました
655
656</p>
657
658<h4>
659  パーミッション付きでインストールする
660</h4>
661
662<p>
663  <a href="{@docRoot}tools/help/adb.html#move"><code>adb
664  install</code></a> コマンドの新しい <code>-g</code> オプションを使ってアプリをインストールし、そのマニフェストにリストされるすべてのパーミッションを付与できます。
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  新しい ADB <a href="{@docRoot}tools/help/adb.html#pm">Package Manager(pm)</a>コマンドを使って、インストールされているアプリにパーミッションを付与したり取り消したりできます。この機能は自動化されたテストに役立ちます。
678
679
680</p>
681
682<p>
683  パーミッションを付与するには、Package Manager の <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  パーミッションを取り消すには、Package Manager の <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  たとえば、アプリがパーミッションを要求する代わりに、<a href="{@docRoot}guide/components/intents-filters.html">インテント</a>を使って必要な機能を取得できる場合がよくあります。
727
728アプリが携帯電話のカメラで写真を撮る必要がある場合、そのアプリでは {@link
729  android.provider.MediaStore#ACTION_IMAGE_CAPTURE
730  MediaStore.ACTION_IMAGE_CAPTURE} インテントを使用できます。
731アプリがインテントを実行すると、写真を撮るためのインストール済みのカメラアプリを選ぶようユーザーに促します。
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  アプリ対して 1 つ以上のパーミッションが必須である場合もあります。その場合は、アプリの起動後すぐに、すべてのパーミッションを要求することが合理的である場合があります。
748
749たとえば、カメラアプリを作成する場合、アプリは端末のカメラにアクセスする必要があります。
750アプリを初めて起動するときにカメラの使用についてのパーミッションを求められても驚かないはずです。
751
752ただし、同じアプリにユーザーの連絡先と写真を共有する機能もある場合は、最初の起動時にパーミッションを要求<em>しない</em>方が無難です。
753
754その代わりに、ユーザーが「共有」機能を使うまで待ち、そのときにパーミッションを要求します。
755
756</p>
757
758<p>
759  アプリにチュートリアルが含まれる場合は、チュートリアルのシーケンスの最後で、アプリに必須のパーミッションを要求する方が合理的です。
760
761</p>
762
763<h3 id="bp-explain">
764  パーミッションが必要な理由を説明する
765</h3>
766
767<p>
768  <code>requestPermissions()</code> を呼び出すとき、システムによって表示されるパーミッション ダイアログにはアプリが必要としているパーミッションは表示されますが、理由は表示されません。
769
770これによりユーザーが困惑する場合もあります。
771  <code>requestPermissions()</code> を呼び出す前に、アプリがパーミッションを必要としている理由をユーザーに説明するのはよい方法です。
772
773</p>
774
775<p>
776  たとえば、カメラアプリでは、位置情報サービスを使って写真に位置情報タグを付けられるようにする場合があります。
777通常のユーザーは、写真に位置情報が含まれる場合があることを認識していない可能性があり、なぜカメラアプリで位置情報が必要なのか困惑する可能性があります。
778
779この場合、アプリが <code>requestPermissions()</code> を呼び出す<em>前</em>に、この機能についてユーザーに知らせることをお勧めします。
780
781
782</p>
783
784<p>
785  その方法として、これらの要求をアプリのチュートリアルに組み込むこともできます。チュートリアルでは、アプリの各機能を順番に表示できるので、必要なパーミッションを説明できます。
786
787たとえば、カメラアプリのチュートリアルでは、「連絡先と写真を共有する」機能について説明し、ユーザーの連絡先を参照するためにアプリにパーミッションが必要であることをユーザーに知らせることができます。
788
789
790その後、アプリは <code>requestPermissions()</code> を呼び出して、ユーザーにそのアクセスを求めることができます。
791もちろん、すべてのユーザーがチュートリアルに従うわけではないため、アプリの通常操作中にパーミッションを確認して要求することも必要です。
792
793
794</p>
795