Google Play は、アプリ マニフェストで宣言されている <uses-feature> 要素を使用して、アプリのハードウェアおよびソフトウェア機能要件を満たしていないデバイスからアプリを除外します。

アプリが必要とする機能を指定すると、Google Play によって、アプリがすべてのユーザーに表示されるのではなく、アプリの機能要件を満たすデバイスのユーザーのみに表示されるようにすることができます。

Google Play がフィルタリングの基準として機能を使用する仕組みに関する重要な情報については、後述の Google Play と機能に基づくフィルタリングをご覧ください。

構文:
<uses-feature
  android:name="string"
  android:required=["true" | "false"]
  android:glEsVersion="integer" />
上位の要素:
<manifest>
説明:
アプリが使用するハードウェア機能またはソフトウェア機能を 1 つ宣言します。

<uses-feature> 宣言の目的は、アプリが依存するハードウェア機能とソフトウェア機能のセットをすべての外部エンティティに通知することです。この要素には required 属性があります。この属性により、「宣言された機能が必須でその機能なしではアプリは動作しない」または「その機能がある方が望ましいがその機能なしでもアプリは動作する」のいずれかを指定できます。機能のサポートは Android デバイスによって異なるため、デバイスによって異なる機能のどれをアプリが使用するかを指定するうえで、<uses-feature> 要素は重要な役割を果たします。

アプリが宣言する使用可能な機能のセットは、Android PackageManager によって使用可能になる機能定数のセットに対応しています。それらのリストは、便宜性を考慮して、このドキュメントの最後に機能リファレンス セクションとして掲載しています。

各機能を個別の <uses-feature> 要素で指定する必要があるため、アプリが複数の機能を必要とする場合は、複数の <uses-feature> 要素を宣言します。たとえば、デバイスの Bluetooth 機能とカメラ機能の両方を必要とするアプリでは、次の 2 つの要素を宣言します。

<uses-feature android:name="android.hardware.bluetooth" />
<uses-feature android:name="android.hardware.camera" />

一般的には、アプリが必要とするすべての機能について必ず <uses-feature> 要素を宣言する必要があります。

宣言された <uses-feature> 要素の用途は情報提供のみです。つまり、アプリのインストール前に、これと一致する機能がデバイスでサポートされているかどうかを Android システム自体がチェックすることはありません。しかし、他のサービス(Google Play など)またはアプリが、アプリに対する処理や操作の一部として、そのアプリの <uses-feature> 宣言をチェックする場合があります。そのため、アプリが使用する機能(後述のリストにあるもの)をすべて宣言することは非常に重要です。

一部の機能については、使用される Open GL のバージョン(glEsVersion で宣言)など、機能のバージョンを定義できる特定の属性が存在します。デバイスに存在するかしないかのいずれかであるその他の機能(カメラなど)は、name 属性で宣言します。

<uses-feature> 要素は API レベル 4 以上を搭載したデバイスでのみアクティブになりますが、たとえ minSdkVersion が 3 以下であっても、すべてのアプリにこの要素を含めることをおすすめします。古いバージョンのプラットフォームを搭載したデバイスでは、この要素は単に無視されます。

注: 機能を宣言する場合、必要に応じて権限をリクエストする必要もあることを忘れないでください。たとえば、アプリが Camera API にアクセスするためには、CAMERA 権限もリクエストする必要があります。権限のリクエストにより、アプリは適切なハードウェアとソフトウェアへのアクセス権を取得できます。一方、アプリが使用する機能の宣言により、アプリは適切なデバイス互換性を保証できます。

属性:
android:name
アプリが使用する 1 つのハードウェア機能またはソフトウェア機能を記述子文字列として指定します。有効な属性値のリストは、ハードウェア機能セクションとソフトウェア機能セクションにあります。属性値では、大文字と小文字が区別されます。
android:required
android:name で指定された機能がアプリにとって必須かどうかを示すブール値。
  • 機能に対して android:required="true" を宣言した場合は、指定された機能がデバイスに存在しなければアプリは動作しないか、動作するように設計されていないことを示します。
  • 機能に対して android:required="false" を宣言した場合は、指定された機能がデバイスに存在していればアプリはその機能を優先的に使用するが、必要に応じてその機能なしでも動作するように設計されていることを示します。

android:required が宣言されていない場合のデフォルト値は、"true" です。

android:glEsVersion
アプリが必要とする OpenGL ES バージョン。上位 16 ビットはメジャー番号を表し、下位 16 ビットはマイナー番号を表します。たとえば、OpenGL ES バージョン 2.0 を指定するには、値を「0x00020000」に設定します。OpenGL ES 3.2 を指定するには、値を「0x00030002」に設定します。

アプリのマニフェストに指定できる android:glEsVersion 属性は最大で 1 つです。複数の値を指定すると、数値が最も大きい android:glEsVersion が使用され、他の値は無視されます。

android:glEsVersion 属性を指定していないアプリは、すべての Android 搭載デバイスでサポートされる OpenGL ES 1.0 のみを必要とするものと見なされます。

アプリでは、プラットフォームが特定の OpenGL ES バージョンをサポートしている場合、それより数値が小さい OpenGL ES バージョンもすべてサポートしていると想定できます。したがって、OpenGL ES 1.0 と OpenGL ES 2.0 の両方を必要とするアプリでは、OpenGL ES 2.0 が必須であることを指定する必要があります。

複数の OpenGL ES バージョンで動作可能なアプリは、必要とする最も数値が小さいバージョンの OpenGL ES のみを指定する必要があります(それより上位の OpenGL ES が使用可能かどうかは実行時にチェックできます)。

サポートされている OpenGL ES バージョンを実行時にチェックする方法を含む OpenGL ES の詳細な使用方法については、OpenGL ES API ガイドをご覧ください。

導入時の API レベル:
API レベル 4
関連項目:

Google Play と機能に基づくフィルタリング

Google Play は、ユーザーに表示するアプリをフィルタします。これにより、ユーザーは、自分のデバイスと互換性があるアプリだけを閲覧してダウンロードすることができます。Google Play がアプリをフィルタする方法の一つに、機能の互換性によるフィルタリングがあります。

Google Play は、アプリの機能と特定のユーザーのデバイスの互換性を判定するために、以下の 2 つを照合します。

  • アプリが必要とする機能 - アプリはマニフェスト内の <uses-feature> 要素で機能を宣言します
  • デバイスで使用できるハードウェア機能またはソフトウェア機能 - デバイスは、サポートする機能を読み取り専用のシステム プロパティとして報告します

機能を正確に照合できるようにするため、Android Package Manager は機能定数の共有セットを提供します。これらは、アプリとデバイスの両方で機能の要件とサポートの宣言に使用できます。使用可能な機能定数のリストは、このドキュメントの最後にある機能リファレンス セクションと、PackageManager のクラス ドキュメントに掲載されています。

ユーザーが Google Play を起動すると、アプリは getSystemAvailableFeatures() を呼び出して、デバイスで使用できる機能のリストをパッケージ マネージャーに問い合わせます。そうすると、ストアアプリは、ユーザーのセッションを確立する際に機能リストを Google Play に渡します。

デベロッパーが Google Play Console にアプリをアップロードすると、そのたびに Google Play はアプリのマニフェスト ファイルをスキャンします。Google Play は <uses-feature> 要素を検索し、場合によっては他の要素(<uses-sdk> 要素や <uses-permission> 要素など)と組み合わせて評価します。アプリにとって必須の機能のセットを確定したら、そのリストをアプリの .apk とアプリのバージョンに関連付けられたメタデータとして内部的に保存します。

ユーザーが Google Play アプリでアプリを検索または閲覧すると、Google Play サービスは、各アプリが必要とする機能と、ユーザーのデバイスで使用できる機能を照合します。アプリが必要する機能がすべてデバイスに存在する場合、Google Play はユーザーがアプリを閲覧して必要であればダウンロードできるようにします。アプリが必要とする機能がデバイスでサポートされていない場合、Google Play はアプリを除外して、ユーザーが閲覧およびダウンロードできないようにします。

<uses-feature> 要素で宣言した機能は、Google Play によるアプリのフィルタリングに直接影響します。したがって、Google Play がアプリのマニフェストを評価して必須の機能のセットを確定する仕組みを理解することが重要です。下記のセクションでは、この点についてさらに詳しく説明します。

明示的に宣言された機能に基づくフィルタリング

明示的に宣言された機能とは、アプリが <uses-feature> 要素で宣言している機能です。機能の宣言には android:required=["true" | "false"] 属性を含めることができます(API レベル 5 以上でコンパイルする場合)。この属性により、「アプリはその機能を絶対的に必要としていて、その機能なしでは適切に動作しない」("true")または「アプリはその機能が使用可能な場合は優先的に使用するが、その機能なしでも動作するように設計されている」("false")のいずれかを指定できます。

Google Play は、明示的に宣言された機能を次のように処理します。

  • ある機能が必須であると明示的に宣言されている場合、Google Play はその機能をアプリの必須機能リストに追加します。次に、その機能を備えていないデバイスを使用しているユーザーに対して、そのアプリを除外します。次に例を示します。
    <uses-feature android:name="android.hardware.camera" android:required="true" />
  • ある機能が必須でないと明示的に宣言されている場合、Google Play はその機能を必須機能リストに追加しません。したがって、明示的に必須でないと宣言されている機能は、アプリをフィルタする際に考慮されません。宣言されている機能をデバイスが備えていなくても、Google Play はアプリがデバイスと互換性があると判断し、他のフィルタリング ルールが適用されない限り、アプリをユーザーに表示します。次に例を示します。
    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • 機能が明示的に宣言されているが android:required 属性が指定されていない場合、Google Play はその機能を必須と見なして、その機能に基づくフィルタリングを設定します。

一般的に、アプリが Android 1.6 以前のバージョンで動作するように設計されている場合、android:required 属性は API で使用できないため、Google Play はすべての <uses-feature> 宣言を必須と見なします。

注: 機能を明示的に宣言して android:required="false" 属性を設定すると、指定した機能に対する Google Play のすべてのフィルタリングを無効にできます。

暗黙的な機能に基づくフィルタリング

「暗黙的」な機能とは、アプリが適切に動作するために必須であるが、マニフェスト ファイルの <uses-feature> 要素で宣言されていない機能です。厳密に言えば、すべてのアプリは使用するか必要とするすべての機能を必ず宣言する必要があるため、アプリが使用する機能が宣言されていない場合は、エラーと見なすべきです。しかし、ユーザーとデベロッパーのための保護措置として、Google Play は明示的に宣言された機能の場合と同様に、各アプリの暗黙的な機能を検索してそれらの機能に基づくフィルタを設定します。

アプリは、ある機能が必須であるにもかかわらず、以下のような理由でそれを宣言しない場合があります。

  • アプリが古いバージョン(Android 1.5 以前)の Android ライブラリでコンパイルされ、<uses-feature> 要素を使用できなかった。
  • デベロッパーが、その機能はすべてのデバイスに存在するので宣言は必要ないと勘違いしていた。
  • デベロッパーが誤って機能の宣言を省略した。
  • デベロッパーが明示的に機能を宣言したが、宣言が有効ではなかった。たとえば、<uses-feature> 要素名のスペルが間違っている場合や、android:name 属性の値が認識できない文字列である場合、機能の宣言は無効になります。

Google Play は、上記のようなケースに対処するため、マニフェスト ファイルで宣言されている他の要素(特に <uses-permission> 要素)を調べて、アプリの暗黙的な機能要件を見つけようと試みます。

アプリがハードウェアに関連する権限をリクエストしている場合、それに対応する機能が <uses-feature> で宣言されていなくても、アプリはその権限に関わるハードウェア機能を使用しており、それゆえその機能は必須であると見なされます。このような権限がある場合、Google Play は、関連するハードウェア機能を、アプリ用に保存するメタデータに追加して、その機能に基づくフィルタを設定します。

たとえば、アプリが CAMERA 権限をリクエストしているが <uses-feature> 要素で android.hardware.camera を宣言していない場合、アプリにはカメラが必要であり、カメラを搭載していないデバイスのユーザーにはアプリを表示すべきでないと判断されます。

Google Play による特定の暗黙的な機能に基づくフィルタリングを避けたい場合は、この動作を無効にできます。そのためには、<uses-feature> 要素で明示的に機能を宣言し、android:required="false" 属性を指定します。たとえば、CAMERA 権限に由来するフィルタリングを無効にするには、次のように機能を宣言します。

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

<uses-permission> 要素でリクエストした権限は、Google Play によるアプリのフィルタリングに直接影響する可能性があることを理解することが重要です。機能要件を暗黙的に示唆する権限のリファレンス セクションには、機能要件を暗黙的に示唆するがゆえにフィルタリングをトリガーする権限の完全なリストが掲載されています。

Bluetooth 機能向けの特別な処理

Bluetooth に関するフィルタリングを決定する際、Google Play は上記とは若干異なるルールを適用します。

アプリが <uses-permission> 要素で Bluetooth 権限を宣言しているが <uses-feature> 要素で Bluetooth 機能を明示的に宣言していない場合、Google Play は、アプリが動作するように設計されている Android プラットフォームのバージョン(<uses-sdk> 要素で指定される)をチェックします。

以下の表に示すように、Google Play は、アプリが最小バージョンのプラットフォームまたはターゲット プラットフォームを Android 2.0(API レベル 5)以上として宣言している場合にのみ、Bluetooth 機能に基づくフィルタリングを有効にします。ただし、アプリが <uses-feature> 要素で Bluetooth 機能を明示的に宣言している場合、Google Play はフィルタリングに通常のルールを適用します。

表 1. Bluetooth 権限をリクエストしているが <uses-feature> 要素で Bluetooth 機能を宣言していないアプリの Bluetooth 機能要件を Google Play が決定する仕組み。

minSdkVersion が下記の場合 または targetSdkVersion が下記の場合 結果
<=4(または uses-sdk が宣言されていない) <=4 Google Play は、報告された android.hardware.bluetooth 機能のサポートに基づいてアプリをデバイスから除外することはありません。
<=4 >=5 Google Play は、android.hardware.bluetooth 機能をサポートしていないデバイス(古いリリースで動作するデバイスを含む)からアプリを除外します。
>=5 >=5

下記の例は、Google Play が Bluetooth 機能を処理する方法に応じた、さまざまなフィルタリング結果を示しています。

最初の例では、古い API レベルで動作するように設計されているアプリが Bluetooth 権限を宣言していますが、<uses-feature> 要素で Bluetooth 機能を宣言していません。
結果: Google Play はいかなるデバイスからもアプリを除外しません。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
下記の 2 番目の例では、同じアプリで対象 API レベルが 5 であることも宣言しています。
結果: Google Play はこの機能が必須であると見なし、Bluetooth のサポートを報告していないすべてのデバイス(古いバージョンのプラットフォームを搭載したデバイスを含む)からアプリを除外します。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
下記の例では、同じアプリが Bluetooth 機能を明示的に宣言しています。
結果: 前の例と同じです(フィルタリングが適用されます)。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
最後に、下記のケースでは、同じアプリが android:required="false" 属性を追加しています。
結果: Google Play は、すべてのデバイスに対して、Bluetooth 機能のサポートに基づくフィルタリングを無効にします。
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>

アプリの必須機能をテストする

Android SDK に含まれる aapt ツールを使用すると、宣言されている機能と権限に基づいて Google Play がアプリをどのようにフィルタするかを確認できます。これを行うには、aaptdump badging ココマンドを実行します。そうすると、aapt によってアプリのマニフェストが解析され、アプリの必須機能を決定するために Google Play が使用するのと同じルールが適用されます。

このツールを使用する手順は次のとおりです。

  1. まず、アプリを未署名の .apk としてビルドし、エクスポートします。Android Studio で開発している場合は、Gradle でアプリをビルドします。
    1. プロジェクトを開いて、[Run] > [Edit Configurations] を選択します。
    2. [Run/Debug Configurations] ウィンドウの左上隅にあるプラス記号を選択します。
    3. [Gradle] を選択します。
    4. [Name] に「Unsigned APK」と入力します。
    5. [Gradle project] セクションでモジュールを選択します。
    6. [Tasks] に「assemble」と入力します。
    7. [OK] を選択して、新しい構成を完了します。
    8. ツールバーで [Unsigned APK] 実行構成が選択されていることを確認して、[Run] > [Run 'Unsigned APK'] を選択します。
    未署名の .apk<ProjectName>/app/build/outputs/apk/ ディレクトリにあります。
  2. 次に、aapt ツールがまだ PATH にない場合は、場所を探します。SDK Tools r8 以上を使用している場合、aapt<SDK>/build-tools/<tools version number> ディレクトリにあります。

    注: 使用可能な最新の Build-Tools コンポーネント向けに提供されているバージョンの aapt を使用する必要があります。最新の Build-Tools コンポーネントがない場合は、Android SDK Manager を使用してダウンロードします。

  3. 次の構文を使用して aapt を実行します。
$ aapt dump badging <path_to_exported_.apk>

前述の Bluetooth に関する 2 番目の例のコマンド出力の例を以下に示します。

$ ./aapt dump badging BTExample.apk
package: name='com.example.android.btexample' versionCode='' versionName=''
uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.bluetooth'
sdkVersion:'3'
targetSdkVersion:'5'
application: label='BT Example' icon='res/drawable/app_bt_ex.png'
launchable activity name='com.example.android.btexample.MyActivity'label='' icon=''
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large'
locales: '--_--'
densities: '160'

機能リファレンス

以降のセクションでは、ハードウェア機能、ソフトウェア機能、特定の機能要件を暗黙的に示唆する権限のセットのリファレンス情報を示します。

ハードウェア機能

このセクションでは、現在提供されているほとんどのプラットフォーム リリースでサポートされているハードウェア機能を示します。アプリがハードウェア機能を使用するか必要とすることを示すには、android:name 属性でそれに対応する値("android.hardware" で始まります)を宣言します。ハードウェア機能を 1 つ宣言するたびに、個別の <uses-feature> 要素を使用します。

オーディオ ハードウェア機能

android.hardware.audio.low_latency
アプリは、デバイスの低レイテンシのオーディオ パイプラインを使用し、それによって音声入出力を処理する際のタイムラグと遅延を短縮します。
android.hardware.audio.output
アプリは、デバイスのスピーカー、オーディオ ジャック、Bluetooth ストリーミング機能、または類似のメカニズムを使用して音声を送信します。
android.hardware.audio.pro
アプリは、デバイスのハイエンド オーディオ機能とパフォーマンス機能を使用します。
android.hardware.microphone
アプリは、デバイスのマイクを使用して音声を録音します。

Bluetooth ハードウェア機能

android.hardware.bluetooth
アプリは、デバイスの Bluetooth 機能を使用し、通常は他の Bluetooth 対応デバイスと通信します。
android.hardware.bluetooth_le
アプリは、デバイスの Bluetooth Low Energy 無線機能を使用します。

カメラ ハードウェア機能

android.hardware.camera
アプリは、デバイスの背面カメラを使用します。前面カメラのみを搭載したデバイスは、この機能を報告しません。したがって、カメラがどちらの面に搭載されているかと関係なくアプリがカメラと通信できる場合は、代わりに android.hardware.camera.any 機能を使用します。
android.hardware.camera.any
アプリは、デバイスのカメラ、またはユーザーがデバイスに接続する外部カメラを使用します。カメラが背面カメラであることがアプリにとって必須でない場合は、android.hardware.camera の代わりにこの値を使用します。
android.hardware.camera.autofocus

アプリは、デバイスのカメラがサポートするオートフォーカス機能を使用します。

アプリがこの機能を使用する場合は、android.hardware.camera 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.camera.capability.manual_post_processing

アプリは、デバイスのカメラがサポートする MANUAL_POST_PROCESSING 機能を使用します。

この機能により、アプリはカメラの自動ホワイト バランス機能をオーバーライドできます。android.colorCorrection.transformandroid.colorCorrection.gains、および TRANSFORM_MATRIXandroid.colorCorrection.mode を使用します。

android.hardware.camera.capability.manual_sensor

アプリは、デバイスのカメラがサポートする MANUAL_SENSOR 機能を使用します。

この機能は、自動露出ロック(android.control.aeLock)のサポートを暗黙的に示唆します。これは、カメラの露出時間と感度を特定の値に固定できる機能です。

android.hardware.camera.capability.raw

アプリは、デバイスのカメラがサポートする RAW 機能を使用します。

この機能は、デバイスが DNG(RAW)ファイルを保存できることと、アプリがそのような RAW 画像を直接処理するために必要な DNG 関連のメタデータをデバイスのカメラが提供することを暗黙的に示唆します。

android.hardware.camera.external
アプリは、ユーザーがデバイスに接続する外部カメラと通信します。ただし、この機能は、アプリが外部カメラを使用できることを保証しません。
android.hardware.camera.flash

アプリは、デバイスのカメラがサポートするフラッシュ機能を使用します。

アプリがこの機能を使用する場合は、android.hardware.camera 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.camera.front

アプリは、デバイスの前面カメラを使用します。

アプリがこの機能を使用する場合は、android.hardware.camera 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.camera.level.full
アプリは、デバイスのカメラの少なくとも 1 つがサポートする FULL レベルの画像キャプチャ機能を使用します。FULL サポートを備えたカメラは、バースト撮影機能、フレーム単位の制御、手動の後処理制御を提供します。

デバイス UI ハードウェア機能

android.hardware.type.automotive

アプリは、自動車内の画面のセットに UI を表示するように設計されています。 ユーザーは、ハードボタン、タッチデバイス、ロータリー コントローラ、マウス状のインターフェースを使用してアプリを操作します。一般的に、自動車の画面は自動車のセンター コンソールまたは計器クラスタに表示されます。通常、これらの画面のサイズと解像度には制限があります。

注: ユーザーはこの種のアプリ UI を使用しながら運転するので、アプリではドライバーの注意力低下を最小限に抑える必要があることに留意してください。

android.hardware.type.television

(非推奨。代わりに android.software.leanback を使用してください。)

アプリは、テレビに UI を表示するように設計されています。この機能では、「テレビ」は一般的なリビングルーム向けのテレビ エクスペリエンスとして定義されます。つまり、コンテンツは大画面に映し出され、ユーザーはテレビから離れて座り、入力は主に D-pad のようなデバイスで行います。通常、マウス、ポインタ、タッチデバイスは使用しません。

android.hardware.type.watch
アプリは、スマートウォッチに UI を表示するように設計されています。スマートウォッチは身体(手首など)に装着します。ユーザーは、デバイスを操作する際、デバイスのすぐ近くにいます。

指紋認証ハードウェア機能

android.hardware.fingerprint
アプリは、デバイスの生体認証ハードウェアを使用して指紋を読み取ります。

ゲームパッド ハードウェア機能

android.hardware.gamepad
アプリは、デバイス自体または接続されたゲームパッドから、ゲーム コントローラ入力をキャプチャします。

赤外線ハードウェア機能

android.hardware.consumerir
アプリは、デバイスの赤外線(IR)機能を使用し、通常は他の消費者向け IR デバイスと通信します。

位置情報ハードウェア機能

android.hardware.location
アプリは、GPS の位置情報、ネットワークの位置情報、基地局の位置情報などを確認するために、デバイスの 1 つまたは複数の機能を使用します。
android.hardware.location.gps

アプリは、デバイスのグローバル ポジショニング システム(GPS)レシーバーから取得した正確な位置情報座標を使用します。

アプリがこの機能を使用する場合は、android.hardware.location 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" 属性とともに宣言されている場合を除きます)。

android.hardware.location.network

アプリは、デバイスでサポートされているネットワーク ベースの位置情報システムから取得したおおよその位置情報座標を使用します。

アプリがこの機能を使用する場合は、android.hardware.location 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" 属性とともに宣言されている場合を除きます)。

NFC ハードウェア機能

android.hardware.nfc
アプリは、デバイスの近距離無線通信(NFC)無線機能を使用します。
android.hardware.nfc.hce

アプリは、デバイスでホストされている NFC カード エミュレーションを使用します。

OpenGL ES ハードウェア機能

android.hardware.opengles.aep
アプリは、デバイスにインストールされている OpenGL ES Android 拡張機能パックを使用します。

センサー ハードウェア機能

android.hardware.sensor.accelerometer
アプリは、デバイスの現在の向きを検出するために、デバイスの加速度計のモーション測定値を使用します。たとえば、アプリは加速度計の測定値を使用して、縦向きと横向きを切り替えるタイミングを決定できます。
android.hardware.sensor.ambient_temperature
アプリは、デバイスの周辺(環境)温度センサーを使用します。たとえば、天気アプリは屋内または屋外の温度を報告できます。
android.hardware.sensor.barometer
アプリはデバイスの気圧計を使用します。たとえば、天気アプリは気圧を報告できます。
android.hardware.sensor.compass
アプリはデバイスの磁力計(コンパス)を使用します。たとえば、ナビゲーション アプリは、ユーザーが現在向いている方向を表示できます。
android.hardware.sensor.gyroscope
アプリは、回転とねじれを検出して 6 軸方向システムを作成するために、デバイスのジャイロスコープを使用します。このセンサーを使用すると、アプリは縦向きと横向きの切り替えが必要かどうかをよりスムーズに検出できます。
android.hardware.sensor.hifi_sensors
アプリはデバイスの高忠実度(Hi-Fi)センサーを使用します。たとえば、ゲームアプリはユーザーの高精細な動きを検出できます。
android.hardware.sensor.heartrate
アプリはデバイスの心拍数モニターを使用します。たとえば、フィットネス アプリは、時間経過に伴うユーザーの心拍数の傾向を報告できます。
android.hardware.sensor.heartrate.ecg
アプリはデバイスの心電図(ECG)心拍数センサーを使用します。たとえば、フィットネス アプリは、ユーザーの心拍数に関する詳細な情報を報告できます。
android.hardware.sensor.light
アプリはデバイスの光センサーを使用します。たとえば、アプリは周囲の明るさの状況に基づいて、2 種類のカラーパターンのいずれかを表示できます。
android.hardware.sensor.proximity
アプリはデバイスの近接センサーを使用します。たとえば、電話アプリは、ユーザーが体の近くでデバイスを持っていることを検出すると、デバイスの画面をオフにできます。
android.hardware.sensor.relative_humidity
アプリはデバイスの相対湿度センサーを使用します。たとえば、天気アプリは湿度から現在の露点温度を計算して報告できます。
android.hardware.sensor.stepcounter
アプリはデバイスの歩数計を使用します。たとえば、フィットネス アプリは、ユーザーが 1 日の歩数目標を達成するために必要な歩数を報告できます。
android.hardware.sensor.stepdetector
アプリはデバイスの歩行検出機能を使用します。たとえば、フィットネス アプリは、歩行の時間間隔を使用して、ユーザーが行っている運動の種類を推測できます。

画面ハードウェア機能

android.hardware.screen.landscape
android.hardware.screen.portrait

デバイスを縦向きまたは横向きにしてアプリを実行する必要があることを示します。アプリが両方の向きをサポートしている場合、どちらの機能も宣言する必要はありません。

たとえば、縦向きで実行する必要があるアプリは、(常に、またはユーザーの選択に応じて)縦向きをサポートするデバイスのみでアプリを実行できるように、次の機能を宣言する必要があります。

<uses-feature android:name="android.hardware.screen.portrait" />

デフォルトではどちらの向きも必須ではないと見なされるため、アプリは、一方または両方の向きをサポートするデバイスにインストールできます。ただし、android:screenOrientation 属性を使用して、なんらかのアクティビティが特定の向きの実行をリクエストしている場合、この宣言はその向きがアプリに必要であることを暗黙的に示唆します。たとえば、android:screenOrientation を宣言して "landscape""reverseLandscape""sensorLandscape" のいずれかを指定すると、アプリは横向きをサポートするデバイスでのみ使用可能になります。

このような向きに関する要件は、<uses-feature> 要素で宣言することをおすすめします。android:screenOrientation を使用してアクティビティの向きを宣言しているが、その向きが実際は必要でない場合は、<uses-feature> 要素で向きを宣言して android:required="false" を指定することにより、要件を無効にできます。

下位互換性を確保するため、Android 3.1(API レベル 12)以前を搭載しているすべてのデバイスは、横向きと縦向きの両方をサポートします。

電話ハードウェア機能

android.hardware.telephony
アプリは、デバイスの電話機能(データ通信サービスを提供する無線電話など)を使用します。
android.hardware.telephony.cdma

アプリは、Code Division Multiple Access(CDMA)無線電話システムを使用します。

アプリがこの機能を使用する場合は、android.hardware.telephony 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.telephony.gsm

アプリは、Global System for Mobile Communications(GSM)無線電話システムを使用します。

アプリがこの機能を使用する場合は、android.hardware.telephony 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

タッチスクリーン ハードウェア機能

android.hardware.faketouch

アプリは、タップやドラッグなどの基本的なタッチ操作イベントを使用します。

この機能が必須として宣言されているときは、デバイスがタッチスクリーンをエミュレートする(「疑似タップ」インターフェースを提供する)か、または実際のタッチスクリーンを搭載している場合にのみ、デバイスがアプリに対応できることを示します。

疑似タップ インターフェースを提供するデバイスは、タッチスクリーンの機能のサブセットをエミュレートするユーザー入力システムを備えています。たとえば、マウスやリモコンで画面上のカーソルを操作できます。アプリが基本的なポイント アンド クリック操作を必要とする(つまり、D-pad コントローラのみでは動作しない)場合は、この機能を宣言する必要があります。これは最低限のタッチ操作であるため、この機能を宣言するアプリは、もっと複雑なタッチ インターフェースを提供するデバイスでも使用できます。

注: アプリはデフォルトで android.hardware.faketouch 機能を必要とします。タッチスクリーンのみを搭載したデバイスにアプリの利用を制限する場合は、次のように、タッチスクリーンが必須であることを明示的に宣言する必要があります。

<uses-feature android:name="android.hardware.touchscreen"
    android:required="true" />

明示的に android.hardware.touchscreen を必要としないすべてのアプリは、android.hardware.faketouch に対応するデバイスでも動作します。

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
android.hardware.faketouch.multitouch.distinct

アプリは、疑似タップ インターフェースで 2 本以上の個別の「指」をトラッキングします。これは android.hardware.faketouch 機能のスーパーセットです。この機能が必須として宣言されているときは、デバイスが 2 本以上の指の個別のトラッキングをエミュレートするか、または実際のタッチスクリーンを搭載している場合にのみ、デバイスがアプリに対応できることを示します。

android.hardware.touchscreen.multitouch.distinct によって定義される個別のマルチタッチとは異なり、疑似タップ インターフェースで個別のマルチタッチをサポートする入力デバイスは、2 本指のジェスチャーをすべてサポートするわけではありません。これは、入力が画面上のカーソル移動に変換されるためです。つまり、そのようなデバイスでは、1 本指のジェスチャーを行うとカーソルが移動し、2 本指のスワイプを行うと 1 本指のタッチイベントが発生します。その他の 2 本指のジェスチャーを行うと、対応する 2 本指のタッチイベントがトリガーされます。

2 本指のタッチ トラックパッドによるカーソルの移動が可能なデバイスは、この機能をサポートできます。

android.hardware.faketouch.multitouch.jazzhand

アプリは、疑似タップ インターフェースで 5 本以上の個別の「指」をトラッキングします。 これは android.hardware.faketouch 機能のスーパーセットです。この機能が必須として宣言されているときは、デバイスが 5 本以上の指の個別のトラッキングをエミュレートするか、または実際のタッチスクリーンを搭載している場合にのみ、デバイスがアプリに対応できることを示します。

android.hardware.touchscreen.multitouch.jazzhand によって定義される個別のマルチタッチとは異なり、疑似タップ インターフェースでジャズハンド マルチタッチをサポートする入力デバイスは、5 本指のジェスチャーをすべてサポートするわけではありません。これは、入力が画面上のカーソル移動に変換されるためです。つまり、そのようなデバイスでは、1 本指のジェスチャーを行うとカーソルが移動し、マルチフィンガー ジェスチャーを行うと 1 本指のタッチイベントが発生します。その他のマルチフィンガー ジェスチャーを行うと、対応するマルチフィンガー タッチイベントがトリガーされます。

5 本指のタッチ トラックパッドによるカーソルの移動が可能なデバイスは、この機能をサポートできます。

android.hardware.touchscreen

アプリは、基本的なタッチイベントよりもインタラクティブな操作(フリングなど)に対応したデバイスのタッチスクリーン機能を使用します。これは android.hardware.faketouch 機能のスーパーセットです。

アプリはデフォルトでこの機能を必要とします。したがって、デフォルトでは、エミュレートされたタッチ インターフェース(「疑似タップ」)のみを提供するデバイスではアプリを使用できません。疑似タップ インターフェースを提供するデバイス(または D-pad コントローラのみを提供するデバイス)でアプリを使用できるようにしたい場合は、android.hardware.touchscreenandroid:required="false" とともに宣言して、タッチスクリーンが必須ではないことを明示的に宣言する必要があります。アプリが実際のタッチスクリーン インターフェースを使用するが、それが必須ではない場合は、この宣言を追加する必要があります。明示的に android.hardware.touchscreen を必要としないすべてのアプリは、android.hardware.faketouch に対応するデバイスでも動作します。

アプリが(フリングなどの高度なタッチ操作を行うための)タッチ インターフェースを実際に必要とする場合、それらのタッチ インターフェース機能はデフォルトで必須であるため、宣言する必要はありません。ただし、アプリが使用するすべての機能を明示的に宣言することが最善です。

マルチフィンガー ジェスチャーなどのもっと複雑なタッチ操作が必要な場合は、アプリが高度なタッチスクリーン機能を使用することを宣言する必要があります。

android.hardware.touchscreen.multitouch

アプリは、デバイスの基本的な 2 点マルチタッチ機能(ピンチ操作など)を使用しますが、タッチの個別のトラッキングは必要としません。これは android.hardware.touchscreen 機能のスーパーセットです。

アプリがこの機能を使用する場合は、android.hardware.touchscreen 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.touchscreen.multitouch.distinct

アプリは、2 個以上の点を個別にトラッキングする、デバイスの高度なマルチタッチ機能を使用します。これは android.hardware.touchscreen.multitouch 機能のスーパーセットです。

アプリがこの機能を使用する場合は、android.hardware.touchscreen.multitouch 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.hardware.touchscreen.multitouch.jazzhand

アプリは、5 個以上の点を個別にトラッキングする、デバイスの高度なマルチタッチ機能を使用します。これは android.hardware.touchscreen.multitouch 機能のスーパーセットです。

アプリがこの機能を使用する場合は、android.hardware.touchscreen.multitouch 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

USB ハードウェア機能

android.hardware.usb.accessory
アプリは USB デバイスとして動作し、USB ホストに接続します。
android.hardware.usb.host
アプリは、デバイスに接続されている USB アクセサリを使用します。デバイスは USB ホストとして機能します。

Vulkan ハードウェア機能

android.hardware.vulkan.compute
アプリは Vulkan のコンピューティング機能を使用します。この機能は、アプリがハードウェア アクセラレーションを備えた Vulkan 実装を必要とすることを示します。機能バージョンは、アプリが Vulkan 1.0 の要件以外に必要とするオプションのコンピューティング機能のレベルを示します。たとえば、アプリが Vulkan コンピューティング レベル 0 のサポートを必要とする場合は、次の機能を宣言する必要があります。
<uses-feature
    android:name="android.hardware.vulkan.compute"
    android:version="0"
    android:required="true" />
機能バージョンについて詳しくは、 FEATURE_VULKAN_HARDWARE_COMPUTE をご覧ください。
android.hardware.vulkan.level
アプリは Vulkan のレベル機能を使用します。この機能は、アプリがハードウェア アクセラレーションを備えた Vulkan 実装を必要とすることを示します。機能バージョンは、アプリが必要とするオプションのハードウェア機能のレベルを示します。たとえば、アプリが Vulkan ハードウェア レベル 0 のサポートを必要とする場合は、次の機能を宣言する必要があります。
<uses-feature
    android:name="android.hardware.vulkan.level"
    android:version="0"
    android:required="true" />
機能バージョンについて詳しくは、 FEATURE_VULKAN_HARDWARE_LEVEL をご覧ください。
android.hardware.vulkan.version
アプリは Vulkan を使用します。この機能は、アプリがハードウェア アクセラレーションを備えた Vulkan 実装を必要とすることを示します。機能バージョンは、アプリが必要とする Vulkan API サポートの最小バージョンを示します。たとえば、アプリが Vulkan 1.0 のサポートを必要とする場合は、次の機能を宣言する必要があります。
<uses-feature
    android:name="android.hardware.vulkan.version"
    android:version="0x400003"
    android:required="true" />
機能バージョンについて詳しくは、 FEATURE_VULKAN_HARDWARE_VERSION をご覧ください。

Wi-Fi ハードウェア機能

android.hardware.wifi
アプリは、デバイスの 802.11 ネットワーク(Wi-Fi)機能を使用します。
android.hardware.wifi.direct
アプリは、デバイスの Wi-Fi Direct ネットワーク機能を使用します。

ソフトウェア機能

このセクションでは、現在提供されているほとんどのプラットフォーム リリースでサポートされているソフトウェア機能を示します。アプリがソフトウェア機能を使用するか必要とすることを示すには、android:name 属性でそれに対応する値("android.software" で始まります)を宣言します。ソフトウェア機能を 1 つ宣言するたびに、個別の <uses-feature> 要素を使用します。

通信ソフトウェア機能

android.software.sip
アプリは、セッション開始プロトコル(SIP)サービスを使用します。SIP を使用することにより、アプリはビデオ会議やインスタント メッセージなどのインターネット電話オペレーションをサポートできます。
android.software.sip.voip

アプリは、SIP ベースの Voice over Internet Protocol(VoIP)サービスを使用します。VoIP を使用することにより、アプリは双方向ビデオ会議などのリアルタイムのインターネット電話オペレーションをサポートできます。

アプリがこの機能を使用する場合は、android.software.sip 機能も使用することが暗黙的に示唆されます(ただし、この親機能が android:required="false" とともに宣言されている場合を除きます)。

android.software.webview
アプリは、インターネットから取得したコンテンツを表示します。

カスタム入力ソフトウェア機能

android.software.input_methods
アプリは、デベロッパーが InputMethodService で定義する新しい入力方法を使用します。

デバイス管理ソフトウェア機能

android.software.backup
アプリは、バックアップと復元オペレーションを処理するロジックを含んでいます。
android.software.device_admin
アプリは、デバイス ポリシーを適用するためにデバイス管理機能を使用します。
android.software.managed_users
アプリは、セカンダリ ユーザーと管理対象プロファイルをサポートします。
android.software.securely_removes_users
アプリは、ユーザーとその関連データを完全に削除できます。
android.software.verified_boot
アプリは、デバイスの確認付きブート機能の確認結果を処理するロジックを含んでおり、再起動オペレーション中にデバイスの構成が変更されたかどうかを検出します。

メディア ソフトウェア機能

android.software.midi
アプリは、MIDI(Musical Instrument Digital Interface)プロトコルを使用して、楽器への接続や音声の出力を行います。
android.software.print
アプリは、デバイスに表示されるドキュメントを印刷するコマンドを含んでいます。
android.software.leanback
アプリは、Android TV デバイスで実行できるように設計されています。
android.software.live_tv
アプリは、生配信されるテレビ番組をストリーミングします。

画面インターフェース ソフトウェア機能

android.software.app_widgets
アプリは、アプリ ウィジェットを使用または提供します。また、ユーザーがアプリ ウィジェットを埋め込むことができるホーム画面または類似の場所を備えたデバイスにのみインストールされるようにする必要があります。
android.software.home_screen
アプリは、デバイスのホーム画面の代替機能として動作します。
android.software.live_wallpaper
アプリは、アニメーションを含む壁紙を使用または提供します。

機能要件を暗黙的に示唆する権限

ハードウェアおよびソフトウェア機能定数の中には、対応する API より後にアプリで使用できるようになったものがあります。たとえば、android.hardware.bluetooth 機能は Android 2.2(API レベル 8)で追加されましたが、この機能が参照する Bluetooth API は Android 2.0(API レベル 5)で追加されました。この理由により、一部のアプリでは、<uses-feature> システムを使用して API を必須と宣言できるようになる前に、それらの API を使用することが可能でした。

そのようなアプリが意図せず提供されることを避けるため、Google Play は、特定のハードウェア関連の権限が、その基盤であるハードウェア機能がデフォルトで必須であることを示していると見なします。たとえば、Bluetooth を使用するアプリは、<uses-permission> 要素で BLUETOOTH 権限をリクエストする必要があります。上記のようなレガシーアプリの場合、Google Play は、権限の宣言によって基盤である android.hardware.bluetooth 機能がアプリにとって必須であることが示されていると見なし、その機能に基づいてフィルタリングを設定します。表 2 は、<uses-feature> 要素で宣言される機能要件と同等の機能要件を暗黙的に示唆する権限のリストです。

<uses-feature> 宣言(宣言された android:required 属性を含む)は、表 2 の権限によって示唆される機能よりも常に優先されることにご注意ください。これらの権限に関して、暗黙的に示唆される機能に基づくフィルタリングを無効にするには、示唆される機能を <uses-feature> 要素で明示的に宣言し、android:required="false" 属性を指定します。たとえば、CAMERA 権限に基づくフィルタリングを無効にするには、次の <uses-feature> 宣言をマニフェスト ファイルに追加します。

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

注意: Android 5.0(API レベル 21)以上をターゲットとするアプリで、ネットワークまたは GPS からそれぞれの位置情報の更新データを受信するために ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION 権限を使用する場合は、アプリが android.hardware.location.network または android.hardware.location.gps ハードウェア機能を使用することも明示的に宣言する必要があります。

表 2: デバイスのハードウェアの使用を暗黙的に示唆するデバイスの権限。

カテゴリ 権限 権限が暗黙的に示唆する機能要件
Bluetooth BLUETOOTH android.hardware.bluetooth

(詳しくは、Bluetooth 機能向けの特別な処理を参照)

BLUETOOTH_ADMIN android.hardware.bluetooth
カメラ CAMERA android.hardware.camera および
android.hardware.camera.autofocus
位置情報 ACCESS_MOCK_LOCATION android.hardware.location
ACCESS_LOCATION_EXTRA_COMMANDS android.hardware.location
INSTALL_LOCATION_PROVIDER android.hardware.location
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (対象 API レベルが 20 以下の場合のみ)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (対象 API レベルが 20 以下の場合のみ)

マイク RECORD_AUDIO android.hardware.microphone
電話 CALL_PHONE android.hardware.telephony
CALL_PRIVILEGED android.hardware.telephony
MODIFY_PHONE_STATE android.hardware.telephony
PROCESS_OUTGOING_CALLS android.hardware.telephony
READ_SMS android.hardware.telephony
RECEIVE_SMS android.hardware.telephony
RECEIVE_MMS android.hardware.telephony
RECEIVE_WAP_PUSH android.hardware.telephony
SEND_SMS android.hardware.telephony
WRITE_APN_SETTINGS android.hardware.telephony
WRITE_SMS android.hardware.telephony
Wi-Fi ACCESS_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_MULTICAST_STATE android.hardware.wifi