アプリの権限を宣言する

権限を使用するためのワークフローで説明したように、アプリの権限をリクエストする場合は、アプリのマニフェスト ファイルで対象となる権限を宣言する必要があります。この宣言により、アプリストアとユーザーは、アプリが要求する可能性のある権限セットについて理解できます。

権限をリクエストするプロセスは、権限の種類によって異なります。

アプリ マニフェストに宣言を追加する

アプリがリクエストする権限を宣言するには、アプリのマニフェスト ファイル内に適切な <uses-permission> 要素を追加します。たとえば、カメラにアクセスする必要があるアプリの場合、AndroidManifest.xml に次の行を記述します。

<manifest ...>
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

ハードウェアをオプションとして宣言する

CAMERA など、一部の権限を利用して、一部の Android デバイスのみに搭載されているハードウェアへのアクセスをアプリに許可します。ハードウェア関連の権限のいずれかがアプリで宣言されている場合は、そのハードウェアが搭載されていないデバイスでもアプリを実行できるかどうかをよく確認してください。ほとんどの場合、ハードウェアはオプションであるため、<uses-feature> 宣言で android:requiredfalse に設定し、ハードウェアをオプションとして宣言することをおすすめします。次の AndroidManifest.xml ファイルのコード スニペットの例をご覧ください。

<manifest ...>
    <application>
        ...
    </application>
    <uses-feature android:name="android.hardware.camera"
                  android:required="false" />
<manifest>

ハードウェアが使用できるかどうかを判断する

ハードウェアをオプションと宣言した場合、そのハードウェアが搭載されていないデバイスでアプリを実行できる可能性があります。デバイスに特定のハードウェアが含まれているかどうかを確認するには、次のコード スニペットに示すように hasSystemFeature() メソッドを使用します。ハードウェアが利用できない場合は、アプリでその機能を適切に無効にします。

Kotlin

// Check whether your app is running on a device that has a front-facing camera.
if (applicationContext.packageManager.hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

Java

// Check whether your app is running on a device that has a front-facing camera.
if (getApplicationContext().getPackageManager().hasSystemFeature(
        PackageManager.FEATURE_CAMERA_FRONT)) {
    // Continue with the part of your app's workflow that requires a
    // front-facing camera.
} else {
    // Gracefully degrade your app experience.
}

API レベルで権限を宣言する

実行時の権限をサポートするデバイス、つまり Android 6.0(API レベル 23)以降を搭載しているデバイスでのみ権限を宣言するには、<uses-permission> 要素ではなく <uses-permission-sdk-23> 要素を追加します。

上記のいずれかの要素を使用する場合は、maxSdkVersion 属性を設定して、指定された値より上のバージョンの Android が搭載されているデバイスには特定の権限が不要であることを指定できます。これで、不要な権限を排除できる一方、それ以前のバージョンのデバイスでは互換性を保つことができます。

たとえば、お客様のアプリは、ユーザーがアプリ内で作成したメディア コンテンツ(写真や動画など)を表示するとします。この場合、アプリが Android 10 以降をターゲットとする限り、Android 10(API レベル 29)以降を搭載したデバイスでは READ_EXTERNAL_STORAGE 権限を使用する必要はありません。ただし、それ以前のデバイスとの互換性を維持するため、READ_EXTERNAL_STORAGE 権限を宣言し、android:maxSdkVersion を 28 に設定できます。