<uses-feature>

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" android:required="true" />
<uses-feature android:name="android.hardware.camera.any" android:required="true" />

一般的には、アプリが必要とするすべての機能に対して、常に <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> 要素で宣言している機能です。API レベル 5 以上に対してコンパイルする場合、機能宣言に android:required=["true" | "false"] 属性を含めることができます。

これにより、アプリがその機能を必要とし、それ("true")なしでは正しく機能しないのか、あるいは、利用可能であればその機能を使用するが、それ("false")なしでも動作するように設計されているかを指定できます。

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

  • 次の例に示すように、機能が必須であると明示的に宣言されている場合、Google Play はその機能をアプリの必須機能リストに追加します。次に、その機能を備えていないデバイスを使用しているユーザーに対しては、そのアプリを除外します。
    <uses-feature android:name="android.hardware.camera.any" 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 は、明示的に宣言された機能と同様に各アプリの暗黙的な機能を検索して、それらの機能に基づくフィルタを設定します。

アプリは、ある機能が必須でありながらも、次のような理由で機能を宣言しない場合があります。

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

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

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

たとえば、アプリが CAMERA 権限をリクエストしている場合は、アプリが android.hardware.camera に対し <uses-feature> 要素を宣言していなくても、アプリに背面(ワールド フェイシング)カメラが必要であると見なされます。そのため、Google Play は、背面カメラを搭載していないデバイスを除外します。

暗黙的に示唆される特定の機能に基づくフィルタリングが Google Play で行われないようにする場合は、<uses-feature> 要素で機能を明示的に宣言し、android:required="false" 属性を追加します。たとえば、CAMERA 権限で暗黙的に示唆されるフィルタリングを無効にするには、次の機能を宣言します。

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" 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 機能を宣言していないアプリに対して、Google Play が Bluetooth 機能要件を決定する仕組み。

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 に含まれる aapt2 ツールを使用すると、宣言されている機能と権限に基づいて Google Play がアプリをどのように除外するかを決定できます。これを行うには、aapt2dump badging コマンドで実行します。そうすると、aapt2 によってアプリのマニフェストが解析され、アプリの必須機能を決定するために 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'] を選択します。
    <ProjectName>/app/build/outputs/apk/ ディレクトリに未署名の APK があります。
  2. まだ PATH にない場合は、aapt2 ツールを検索します。SDK Tools r8 以上を使用している場合、aapt2<SDK>/build-tools/<tools version number> ディレクトリにあります。

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

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

前に示した 2 つ目の Bluetooth 例に対し、コマンド出力例を次に示します。

$ ./aapt2 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 無線機能を使用します。

カメラ ハードウェア機能

注: Google Play によるアプリの不要なフィルタリングを防ぐため、アプリの動作に必要ないすべてのカメラ機能に android:required="false" を追加してください。この要素を追加しないと、その機能は必要であると見なされ、その機能をサポートしていないデバイスはアプリにアクセスできなくなります。

大画面のサポート

大画面のデバイスによっては、一部のカメラ機能がサポートされていないことがあります。一般に、Chromebook には背面(ワールド フェイシング)カメラ、オートフォーカス、フラッシュは搭載されていませんが、前面(ユーザー フェイシング)カメラは搭載され、通常は外部カメラに接続されます。

基本的なカメラサポートを提供し、できるだけ多くのデバイスでアプリを使用できるようにするには、アプリ マニフェストに次のカメラ機能の設定を追加します。

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

アプリのユースケースに対応するように機能の設定を調整します。なお、多くのデバイスでアプリを使用できるようにするには、必ず required 属性を追加し、機能が必須かどうかを明示的に指定します。

機能リスト
android.hardware.camera.any

アプリは、デバイスのカメラ、またはデバイスに接続されている外部カメラを使用します。カメラがそれぞれ背面(ワールド フェイシング)であるか、前面(ユーザー フェイシング)であるかを求めないアプリでは、android.hardware.cameraandroid.hardware.camera.front の代わりにこの機能を使用します。

CAMERA 権限は、アプリが android.hardware.camera も使用することを暗黙的に示唆しています。android.hardware.cameraandroid:required="false" とともに宣言されている場合を除き、背面カメラは必須機能です。

android.hardware.camera

アプリは、デバイスの背面(ワールド フェイシング)カメラを使用します。

注意: 前面(ユーザー フェイシング)カメラのみが搭載されている Chromebook などのデバイスは、この機能をサポートしていません。カメラがどちらの面に搭載されているかにかかわらず、アプリがカメラを使用できる場合は、android.hardware.camera.any を使います。

注: CAMERA 権限により、背面カメラが必須機能であることが暗黙的に示唆されています。アプリ マニフェストに CAMERA 権限が含まれている場合に Google Play で適切にフィルタリングが行われるようにするには、以下
のようにアプリが camera 機能を使用することを明示的に指定して、この機能が必要かどうかを示します。 <uses-feature android:name="android.hardware.camera" android:required="false" />

android.hardware.camera.front

アプリは、デバイスの前面(ユーザー フェイシング)カメラを使用します。

CAMERA 権限は、アプリが android.hardware.camera も使用することを暗黙的に示唆しています。android.hardware.cameraandroid:required="false" とともに宣言されている場合を除き、背面カメラは必須機能です。

注意: アプリで android.hardware.camera.front を使用しているが、android.hardware.camera を明示的に android.required="false" で宣言していない場合、背面カメラのないデバイス(Chromebook など)は Google Play で除外されます。アプリが前面カメラのみのデバイスをサポートしている場合は、android.required="false"android.hardware.camera を宣言し、不要なフィルタリングを防ぎます。

android.hardware.camera.external

アプリは、ユーザーがデバイスに接続する外部カメラと通信します。この機能は、アプリが外部カメラを使用できることを保証するものではありません。

CAMERA 権限は、アプリが android.hardware.camera も使用することを暗黙的に示唆しています。android.hardware.cameraandroid:required="false" とともに宣言されている場合を除き、背面カメラは必須機能です。

android.hardware.camera.autofocus

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

注: CAMERA 権限は、オートフォーカスが必須機能であることを暗黙的に示唆しています。アプリ マニフェストに CAMERA 権限が含まれている場合に Google Play で適切にフィルタリングが行われるようにするには、以下
のように、アプリがオートフォーカス機能を使用することを明示的に指定して、この機能が必要かどうかを示します。 <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

android.hardware.camera.flash

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

android.hardware.camera.capability.manual_post_processing

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

この機能により、アプリはカメラの自動ホワイト バランス機能をオーバーライドできます。TRANSFORM_MATRIXandroid.colorCorrection.transformandroid.colorCorrection.gainsandroid.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.level.full
アプリは、デバイスのカメラの少なくとも 1 つから提供される FULL レベルの画像キャプチャ サポートを使用します。FULL のサポートには、バースト撮影機能、フレーム単位の制御、手動の後処理制御が含まれます。詳しくは、INFO_SUPPORTED_HARDWARE_LEVEL_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.type.pc

アプリは、Chromebook で UI を表示するように設計されています。Chromebook ではマウスとタッチパッドのハードウェアを使用するため、この機能によりマウスとタッチパッドの入力エミュレーションが無効になります。マウス入力をご覧ください。

注: この要素には required="false" を設定します。設定しない場合、Chromebook 以外のデバイスでは Google Play ストアでアプリを使用できません。

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

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 属性を使用して、なんらかのアクティビティが特定方向での実行をリクエストしている場合、この宣言により、アプリにはその向きが必須であると暗黙的に示唆されます。

たとえば、"landscape""reverseLandscape" あるいは "sensorLandscape" のいずれかで android:screenOrientation を宣言すると、アプリは横向きをサポートするデバイスでのみ使用可能になります。

<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 より後にアプリで使用できるようになるものがあります。この理由により、一部のアプリでは、<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> 要素で明示的に宣言し、required 属性を false に設定します。

たとえば、CAMERA 権限に基づくフィルタリングを無効にするには、次の <uses-feature> 宣言をマニフェスト ファイルに追加します。

<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" 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