Google Play 會使用應用程式資訊清單中宣告的 <uses-feature> 元素,篩選不符合應用程式硬體和軟體功能要求的裝置。

您可以透過指定應用程式需要的功能,讓 Google Play 僅對符合應用程式功能需求的使用者顯示應用程式,而不向所有使用者顯示。

如要瞭解 Google Play 如何運用功能做為篩選依據的重要資訊,請參閱下文中的 Google Play 和依功能篩選

語法:
<uses-feature
  android:name="string"
  android:required=["true" | "false"]
  android:glEsVersion="integer" />
包含於:
<manifest>
說明:
宣告應用程式使用的一項硬體或軟體功能。

<uses-feature> 宣告的目的是告知任何外部實體,應用程式需要的硬體和軟體功能集。該元素提供 required 屬性,可讓您指定應用程式是否需要宣告的功能,沒有該功能便無法正常運作;或者只是偏好的功能,沒有該功能仍然可以正常運作。由於功能支援可能因 Android 裝置而異,為了讓應用程式描述隨裝置而變的功能,<uses-feature> 元素相當重要。

應用程式宣告的可用功能集對應到 Android PackageManager 提供的功能常數集。為了方便起見,這些功能常數列於本文末尾的功能參考資料章節。

每項功能必須在一個單獨的 <uses-feature> 元素中指定,因此,如果您的應用程式需要多項功能,會宣告多個 <uses-feature> 元素。舉例來說,如果應用程式需要裝置同時具有藍牙和相機功能,會宣告這兩個元素:

<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 屬性進行宣告。

雖然只有執行 API 級別 4 以上的裝置才能啟用 <uses-feature> 元素,但建議您為所有應用程式加入這些元素,即使 minSdkVersion 為「3」以下。執行舊版平台的裝置會直接忽略該元素。

注意:宣告功能時,也請務必視需要要求權限。舉例來說,您仍然必須先要求 CAMERA 權限,您的應用程式才能存取相機 API。透過要求權限,您的應用程式將能夠存取適當的硬體和軟體,而宣告應用程式使用的功能可確保裝置的相容性。

屬性:
android:name
以描述元字串的形式,為應用程式指定一項硬體或軟體功能。如需有效的屬性值清單,請參閱硬體功能軟體功能章節。這些屬性值有大小寫之分。
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 屬性。如果指定多個屬性,系統會使用數值最大的 android:glEsVersion,並忽略所有其他值。

如果應用程式未指定 android:glEsVersion 屬性,系統會假設應用程式只需要 OpenGL ES 1.0,這是所有 Android 裝置都支援的版本。

應用程式會認為,如果平台支援給定的 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 級別 4
另請參閱:

Google Play 和依功能篩選

Google Play 會篩選向使用者顯示的應用程式,讓使用者只能查看及下載與其個人裝置相容的應用程式。應用程式篩選的方法之一是按功能相容性進行篩選。

為判定應用程式的功能與給定使用者裝置的相容性,Google Play 會進行如下比對:

  • 應用程式所需的功能:應用程式會在其資訊清單
    內的 <uses-feature> 元素中宣告這些功能...
  • 裝置上提供的硬體或軟體功能:裝置會以唯讀系統屬性的形式報告其支援的功能。

為了確保功能比對的準確性,Android 套件管理器會提供共用的功能常數集,應用程式和裝置均可使用該常數集來宣告功能需求和支援。可用功能常數列於本文末尾處的功能參考資料章節及 PackageManager 的類別文件中。

當使用者啟動 Google Play 時,應用程式會透過呼叫 getSystemAvailableFeatures(),在套件管理器中查詢裝置功能清單。然後,在為使用者建立工作階段時,Google 商店應用程式會將功能清單向上傳遞給 Google Play。

每次您將應用程式上傳到 Google Play 管理中心時,Google Play 都會掃描應用程式的資訊清單檔案。Google Play 會尋找 <uses-feature> 元素,並在某些情況下結合其他元素 (例如,<uses-sdk><uses-permission> 元素) 對其進行評估。建立好應用程式的必要功能集後,Google Play 會在內部將該清單儲存為與應用程式 .apk 及其版本相關聯的中繼資料。

當使用者使用 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 會將該功能新增至應用程式的必要功能清單中。之後,Google Play 會從未提供該功能的裝置上篩選該應用程式,不向使用者顯示。例如:
    <uses-feature android:name="android.hardware.camera" android:required="true" />
  • 如果某個功能被明確宣告為「非」必要,Google Play 就「不會」將該功能新增至必要功能清單中。因此,在篩選應用程式時,Google Play 絕對不會考慮明確宣告為非必要的功能。即使裝置未提供宣告的功能,Google Play 仍會將該應用程式視為與裝置相容,並向使用者顯示該應用程式,除非有其他適用的篩選規則。例如:
    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • 如果功能已明確宣告,但沒有 android:required 屬性,Google Play 會認為該功能為必要功能,並對其設定篩選條件。

一般來說,如果您的應用程式設計為在 Android 1.6 以下版本上執行,那麼 API 中就不會提供 android:required 屬性,Google Play 會認為所有宣告的 <uses-feature> 均為必要功能。

注意:只要明確宣告功能並加入 android:required="false" 屬性,即可有效防止 Google Play 篩選特定功能。

根據隱含功能篩選

「隱含」功能是指應用程式正常運作所需,但「並未」在資訊清單檔案 <uses-feature> 元素中宣告的功能。嚴格來說,所有應用程式「一律」需要宣告其使用或必需的所有功能,因此,如果缺少應用程式所用功能的宣告,應視為錯誤。不過,為了保護使用者和開發人員,Google Play 會尋找每個應用程式中的隱含功能,並為這些功能設定篩選條件,方法與明確宣告的功能相同。

應用程式需要某功能但不予以宣告的原因是:

  • 此應用程式針對舊版 Android 程式庫 (Android 1.5 以下版本) 編譯而成,無法使用 <uses-feature> 元素。
  • 開發人員誤認為這項功能會在所有裝置上提供,不需要宣告。
  • 開發人員不慎遺漏該功能的宣告。
  • 開發人員已明確宣告這項功能,但宣告無效。舉例來說,<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-permission> 元素中要求的權限會直接影響 Google Play 篩選應用程式的方式。參考資料一節「隱含功能需求的權限」部分完整列出了隱含功能需要並因此觸發篩選的權限。

藍牙功能的特殊處理方式

Google Play 在判斷藍牙的篩選時,會採用與上述稍微不同的規則。

如果應用程式在 <uses-permission> 元素中宣告了藍牙權限,但未在 <uses-feature> 元素中明確宣告藍牙功能,Google Play 會依照 <uses-sdk> 元素中指定的方法來檢查設計用於執行應用程式的 Android 平台。

如下表所示,只有當應用程式將其最低或目標平台宣告為 Android 2.0 (API 級別 5) 以上版本時,Google Play 才會啟用藍牙功能篩選。不過,請注意,如果應用程式在 <uses-feature> 元素中明確宣告藍牙功能,Google Play 會套用一般篩選規則。

表 1. Google Play 如何為要求藍牙權限但未在 <uses-feature> 元素中宣告藍牙功能的應用程式判斷藍牙功能需求。

如果 minSdkVersion 為 ... 或者 targetSdkVersion 結果
<=4 (或未宣告 uses-sdk) <=4 Google Play「不會」根據裝置報告對 android.hardware.bluetooth 功能的支援情況,在任何裝置中篩選該應用程式。
<=4 >=5 Google Play 會在所有不支援 android.hardware.bluetooth 功能的裝置 (包括較舊的版本) 篩選該應用程式。
>=5 >=5

下列範例根據 Google Play 處理藍牙功能的方式,說明了不同的篩選效果。

在第一個例子中,設計在舊版 API 級別執行的應用程式宣告了藍牙權限,但未在 <uses-feature> 元素中宣告藍牙功能。
結果:Google Play 不會任何裝置篩選該應用程式。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
在第二個例子中,同一應用程式還宣告了目標 API 級別「5」。
結果:Google Play 現在假設這是必要功能,並會在未報告支援藍牙的所有裝置 (包括執行舊版平台的裝置) 上篩選該應用程式。
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
在本例中,同一個應用程式現已明確宣告藍牙功能。
結果:與前一例相同 (套用篩選)。
<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 對所有裝置停用了根據藍牙功能支援的篩選。
<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 如何根據其宣告的功能和權限篩選應用程式。方法是使用 dump badging 指令執行 aapt。這個指令可以讓 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」(Gradle 專案) 部分選擇您的模組。
    6. 在「Tasks」(工作) 中輸入 assemble
    7. 選取「OK」(確定) 以完成新的設定。
    8. 確認已在工具列中選取「Unsigned APK」(未簽署的 APK) 的執行設定,然後依序選取「Run」(執行) > 「Run 'Unsigned APK'」(執行「未簽署的 APK」)
    您可以在 <ProjectName>/app/build/outputs/apk/ 目錄中找到未簽署的 .apk
  2. 接著,如果 aapt 工具未出現在您的路徑中,請找到該工具。如果您使用的是 SDK Tools r8 以上版本,您可以在 <SDK>/build-tools/<tools version number> 目錄中找到 aapt

    注意:您必須使用為最新可用的 Build-Tools 元件提供的 aapt 版本。如果您沒有最新的 Build-Tools 元件,請使用 Android SDK Manager 下載。

  3. 使用下列語法執行 aapt
$ aapt dump badging <path_to_exported_.apk>

以下是上述第二個藍牙範例的指令輸出範例:

$ ./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" 開頭)。每次宣告一個硬體功能時,都請使用一個單獨的 <uses-feature> 元素。

音訊硬體功能

android.hardware.audio.low_latency
應用程式使用裝置的低延遲音訊管道,從而縮短處理音訊輸入或輸出時的延隔和延遲時間。
android.hardware.audio.output
應用程式使用裝置的喇叭、耳機插孔、藍牙串流功能或其他類似的機制來傳輸音訊。
android.hardware.audio.pro
應用程式使用裝置的高階音訊功能與效能功能。
android.hardware.microphone
應用程式使用裝置的麥克風來錄音。

藍牙硬體功能

android.hardware.bluetooth
應用程式使用裝置的藍牙功能,通常用於與其他支援藍牙的裝置通訊。
android.hardware.bluetooth_le
應用程式使用裝置的藍牙低功耗無線電功能。

相機硬體功能

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 功能。

這項功能可讓您的應用程式覆寫相機的自動白平衡功能。請使用 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 (原始) 檔案,且裝置的相機會提供應用程式直接處理這些原始圖片所需的 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
應用程式使用裝置至少有一部相機提供的 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 定位、網路訂位或行動數據定位。
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
應用程式使用裝置的陀螺儀偵測旋轉和扭轉,建立一個六軸定向系統。透過使用這個感應器,應用程式可以更加流暢地偵測出是否需要在直向和橫向螢幕方向之間切換。
android.hardware.sensor.hifi_sensors
應用程式使用裝置的高傳真 (Hi-Fi) 感應器。舉例來說,遊戲應用程式可以偵測使用者的高精確度動作。
android.hardware.sensor.heartrate
應用程式使用裝置的心率監測器。舉例來說,健身應用程式可以報告使用者心率隨時間的變化趨勢。
android.hardware.sensor.heartrate.ecg
應用程式使用裝置的心電圖 (ECG) 心率感應器。舉例來說,健身應用程式可以報告更詳細的使用者心率資訊。
android.hardware.sensor.light
應用程式使用裝置的光度感應器。舉例來說,應用程式可根據環境亮度條件,顯示兩種不同色彩配置中的一種。
android.hardware.sensor.proximity
應用程式使用裝置的鄰近感應器。舉例來說,當應用程式偵測到使用者將裝置貼近身體時,電話應用程式可以關閉裝置的螢幕。
android.hardware.sensor.relative_humidity
應用程式使用裝置的相對濕度感應器。舉例來說,天氣應用程式可利用濕度計算並報告目前的露點。
android.hardware.sensor.stepcounter
應用程式使用裝置的計步器。舉例來說,健身應用程式可以報告使用者需要走多少步,才能達成每日步數目標。
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

應用程式使用分碼多重進接 (CDMA) 無線電話系統。

使用此功能,即表示應用程式會使用 android.hardware.telephony 功能,除非使用 android:required="false" 宣告這項父功能。

android.hardware.telephony.gsm

應用程式使用全球行動通訊系統 (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

應用程式在觸控模擬介面上區分兩根或更多「手指」的觸控軌跡。這是 android.hardware.faketouch 功能的超集。如此功能宣告為必要,表示只有當裝置模擬區分兩根或更多手指的觸控軌跡或設有實際觸控螢幕時,應用程式才能與裝置相容。

android.hardware.touchscreen.multitouch.distinct 所定義的區分式多點觸控不同,透過觸控模擬介面支援區分式多點觸控的輸入裝置不支援所有的雙指手勢,因為輸入內容會轉換成螢幕上的滑鼠遊標移動。換句話說,在這類裝置上,單指手勢會移動遊標,雙指滑動會觸發單指觸控事件,而其他雙指手勢則會觸發相應的雙指觸控事件。

如果裝置提供雙指觸控板來進行游標移動,則可支援這項功能。

android.hardware.faketouch.multitouch.jazzhand

應用程式在觸控模擬介面上區分五根或更多「手指」的觸控軌跡。這是 android.hardware.faketouch 功能的超集。如此功能宣告為必要,表示只有當裝置模擬區分五根或更多手指的觸控軌跡或設有實際觸控螢幕時,應用程式才能與裝置相容。

android.hardware.touchscreen.multitouch.jazzhand 所定義的區分式多點觸控不同,透過觸控模擬介面支援五指式多點觸控的輸入裝置不支援所有的五指手勢,因為輸入內容會轉換成螢幕上的滑鼠遊標移動。換句話說,在這類裝置上,單指手勢會移動遊標,多指手勢會觸發單指觸控事件,而其他多指手勢則會觸發相應的多指觸控事件。

如果裝置提供五指觸控板來進行游標移動,則其可支援這項功能。

android.hardware.touchscreen

應用程式利用裝置的觸控螢幕功能,來實現比基本觸控事件更具互動性的手勢,例如快速滑過。這是 android.hardware.faketouch 功能的超集。

根據預設,您的應用程式需要這項功能。因此,如果根據預設,裝置只提供模擬觸控介面 (「觸控模擬」),則該裝置無法使用您的應用程式。如果想要在提供觸控模擬介面的裝置 (甚至是僅提供 D-pad 控制器的裝置上) 上使用您的應用程式,您必須透過用 android:required="false" 宣告 android.hardware.touchscreen 來明確宣告應用程式不需要觸控螢幕。如果您的應用程式使用真實的觸控螢幕介面 (但並非必要),您應該新增這個宣告。所有未明確要求 android.hardware.touchscreen 的應用程式也都能在帶有 android.hardware.faketouch 的裝置上使用。

如果您的應用程式確實需要觸控介面 (例如執行快速滑過等進階的觸控手勢),則您不必宣告任何觸控介面功能,因為系統會根據預設使用這類介面。不過,建議您還是明確宣告應用程式使用的所有功能。

如果您需要更複雜的觸控互動功能 (例如多指手勢),則應宣告您的應用程式要使用進階觸控螢幕功能。

android.hardware.touchscreen.multitouch

應用程式使用裝置的基本雙點式多點觸控功能 (例如雙指撥動手勢),但不需要獨立追蹤觸控軌跡。這是 android.hardware.touchscreen 功能的超集。

使用此功能,即表示應用程式會使用 android.hardware.touchscreen 功能,除非使用 android:required="false" 宣告這項父功能。

android.hardware.touchscreen.multitouch.distinct

應用程式使用裝置的進階多點觸控功能,來獨立追蹤兩個或多個點的軌跡。這項功能是 android.hardware.touchscreen.multitouch 功能的超集。

使用此功能,即表示應用程式會使用 android.hardware.touchscreen.multitouch 功能,除非使用 android:required="false" 宣告這項父功能。

android.hardware.touchscreen.multitouch.jazzhand

應用程式使用裝置的進階多點觸控功能獨立追蹤五個或更多點的軌跡。這項功能是 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" 開頭)。每次宣告一個軟體功能時,都請使用一個單獨的 <uses-feature> 元素。

通訊軟體功能

android.software.sip
應用程式使用工作階段啟動協定 (SIP) 服務。透過使用 SIP,應用程式可支援網際網路電話作業,如視訊會議和即時通訊。
android.software.sip.voip

應用程式使用以 SIP 為基礎的 IP 網路語音傳遞技術 (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) 通訊協定連線至樂器或輸出聲音。
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) 中新增,但參照的藍牙 API 在 Android 2.0 (API 級別 5) 中新增。因此,一些應用程式在能夠利用 <uses-feature> 系統來宣告需要某個 API 之前,便已具備使用該 API 的能力。

為了避免在無意間提供這些應用程式,Google Play 會假設某些硬體相關權限規定,預設需要使用基礎硬體功能。舉例來說,使用藍牙的應用程式必須在 <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) 以上版本,並使用 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION 權限來接收來自網路或 GPS 的位置更新,您也必須明確宣告您的應用程式使用 android.hardware.location.networkandroid.hardware.location.gps 硬體功能。

表 2. 隱含裝置硬體使用行為的裝置權限。

類別 這項權限... ...隱含此功能需求
藍牙 BLUETOOTH android.hardware.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