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>] > <i>[app_name]</i> > [<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><uses-permission-sdk-m></code> 要素を使って、M Developer Preview のみで必要なパーミッションを表示できます。 336このようにしてパーミッションを宣言すると、アプリを以前の端末にインストールする場合はユーザーにメッセージが表示されないか、アプリにパーミッションが付与されません。<code><uses-permission-sdk-m></code> 要素を使うと、新しいパーミッションを追加してインストールをアップデートするときにパーミッションの付与を強制せずにアプリのバージョンがアップデートされます。 337 338 339 340 341 342 343</p> 344 345<p> 346 M Developer Preview を使ってアプリが端末で実行されている場合、<code><uses-permission-sdk-m></code> は <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></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><uses-permission-sdk-m></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@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 <path_to_apk> 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 <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 パーミッションを取り消すには、Package Manager の <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 たとえば、アプリがパーミッションを要求する代わりに、<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