<uses-feature>
英文原文:http://developer.android.com/guide/topics/manifest/uses-feature-element.html
采集(更新)日期:2014-7-7
搬遷自原博客:http://blog.sina.com.cn/s/blog_48d491300100zmwf.html
Google Play 的過濾機制
通過應用程序 Manifest 文件中聲明的 <uses-feature> 元素, Google Play 將會把不滿足軟硬件特性需求的設備過濾出去。
通過指定應用程序的設備特性需求,可以使得 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中的相關常量,為了方便起見,在本文最后的 Features 參考手冊中已將這些常量列出。由於每一項設備特性必須放在獨立的一條
<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屬性進行聲明。盡管
<uses-feature>元素僅對 API 級別 4 以上版本的設備才有效,仍然建議所有應用程序都要包含本元素, 即使minSdkVersion小於等於“3”也應如此。 只是運行較低版本系統的設備會忽略本元素罷了。注意 一旦聲明了一項特性,請記得必須同時申請相應的權限。 例如,在使用攝像頭 API 之前,還必須申請
CAMERA權限。 權限申請使得應用程序有權訪問相應的軟、硬件,而聲明需要用到的特性可以保證合適的設備兼容性。 - 屬性:
-
-
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 2.1,應該設為“0x00020001”。 要指定為 OpenGL ES 3.0,則應該設為“0x00030000”。
應用程序應該在 Manifest 中至少定義一項
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 指南。
-
- 引入自:
- API 級別 4
- 參閱:
Google Play 和基於設備特性的過濾機制
Google Play 會對應用程序的用戶可見性進行過濾,因此用戶只能看到和下載那些與自己的設備兼容的應用程序。 其中一種過濾方式是根據設備特性的兼容性。
為了確定應用程序與給定用戶設備的兼容性, Google Play 將對比:
- 應用程序需要的設備特性 — 應用程序 Manifest 文件的
<uses-feature>元素中聲明的特性
和 - 設備提供的硬件或軟件特性 — 設備以系統只讀屬性的形式報告的特性。
為了保證設備特性的精確匹配,Android 包管理器給出了一組公開的特性常量,應用程序和設備共同使用這組常量來聲明特性需求和支持。 合法的特性常量已在本文底部的設備特性參考表中列出,同時也在 PackageManager 類的文檔中給出。
當用戶打開 Google Play 時,應用程序會調用 getSystemAvailableFeatures() 查詢包管理器以列出設備可用的特性。 在與用戶建立連接時, Store 程序會把設備特性清單上傳給 Google Play 。
每次把應用程序上傳到 Google Play Developer Console 時, Google Play 會掃描該應用程序的 Manifest 文件。 它會查找 <uses-feature> 元素並綜合其他元素進行評估, 比如某些時候會參考 <uses-sdk> 和 <uses-permission> 元素。 在收集完應用程序的設備特性需求后,它會將此清單作為與應用程序的 .apk 及版本相關聯的基礎元數據進行內部保存。
當用戶在 Google Play 上搜索或瀏覽應用程序時,后台服務會把程序需求與用戶設備可用的特性進行比較。 如果設備能夠滿足某個應用程序所有的特性需求, Google Play 就允許用戶看見該應用,自然也會提供下載。 只要任何一個特性需求不能被設備支持, Google Play 就會濾除該應用,於是用戶就看不到此應用程序,也就無法下載。
因為在 <uses-feature> 元素中聲明的設備特性會直接影響 Google Play 對應用程序的過濾行為, 所以請理解 Google Play 如何評估應用程序的 Manifest 文件並建立特性需求清單,這點非常重要。 下一章節里給出了更為詳細的說明。
基於顯式聲明的特性需求進行過濾
顯式聲明的特性是指應用程序在 <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 以下版本進行設計的,那么系統 API 是不支持 android:required 屬性的, Google Play 會假定所有的 <uses-feature> 聲明都是必須滿足的。
注意: 通過顯式聲明某項特性並包含 android:required="false" 屬性,可以有效地禁用 Google Play 對該特性的所有過濾行為。
基於隱含的特性需求進行過濾
隱含特性是指程序正常運行所必需的,但 未 在 Manifest 文件的 <uses-feature> 元素中聲明的那些特性需求。 嚴格意義上說,所有應用程序都應該確保對其需要的或用到的全部設備特性進行聲明,因此對用到的特性缺少聲明應該被視為差錯。 然而,作為對用戶和開發人員的保護措施, Google Play 會查找每個應用程序的隱含特性需求並為其進行過濾,就如同這些特性已經顯式聲明過一樣。
應用程序也許需要用到某個特性,但卻沒有進行聲明,原因可能是:
- 該應用程序是用較低版本的 Android 庫( Android 1.5 以下)編譯的, 當時還不支持
<uses-feature>元素。 - 開發人員錯誤地認為所有設備都應提供此項特性,也就沒必要聲明了。
- 開發人員無意間遺漏了特性的聲明。
- 開發人員明確聲明了某特性需求,但聲明不合法。 比如,
<uses-feature>元素的名稱拼寫錯了, 或把無法識別的字符串賦值給了android:name屬性, 這些都會導致聲明不合法。
考慮到上述情況, Google Play 會嘗試檢查 Manifest 文件中的其他元素, 以便發現應用程序隱含的特性需求,特別是 <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> 元素中聲明了 Bluetooth 權限, 但未在 <uses-feature> 元素中顯式聲明 Bluetooth 特性, Google Play 將會檢查應用程序設計時在 <uses-sdk> 元素中指定的目標 Android 平台版本。
如下表所列,僅當程序聲明最低目標版本為 Android 2.0 (API 級別 5)以上時, Google Play 才會啟用對藍牙特性的過濾。 不過請注意,如果程序在 <uses-feature> 元素中顯式聲明了 Bluetooth 特性,則 Google Play 仍將適用正常的過濾規則。
表 1 對已請求藍牙權限但未在 <uses-feature> 元素中聲明 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 對藍牙特性進行過濾的各種效果。
-
在第一個例子中,應用程序設計時是運行於低版本 API 的,它聲明了 Bluetooth 權限, 但未在
<uses-feature>元素中聲明 Bluetooth 特性。 - 結果: 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>
- 下面還是同一個程序,但特地聲明了 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"屬性。 Android Market對所有設備關閉基於Bluetooth feature支持的過濾, - 結果: 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 是否會根據聲明的特性和權限對應用程序進行過濾。 只要運行帶有 dump badging參數的 aapt 即可。 aapt 將會解析 Manifest 文件,並按照 Google Play 的規則來確定應用程序需要的設備特性。
請按以下步驟使用此工具:
- 首先,創建程序並生成未簽名的
.apk。 如果使用帶 ADT 的 Eclipse 進行開發,請右鍵點擊 project 並選擇 Android Tools > Export Unsigned Application Package。 選中目標文件名和路徑並點擊 OK 。 - 其次,如果未在 PATH 環境變量中包含
aapt工具的路徑,則請定位到其所在目錄。 如果正在使用的 SDK 工具為 r8 以上版本,則可以在<SDK> /platform-tools/目錄中找到aapt。注意: 必須使用最新版的 Platform-Tool 組件所提供的 aapt 。 如果沒有最新版本的 Platform-Tool 組件,請用 Android SDK Manager 下載。
- 使用以下語法執行
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'
設備特性參考手冊
下列表格列出了與軟、硬件特性相關的參考信息,以及可在 Google Play 中隱含聲明特性的權限。
硬件特性
下表說明了最新版本的系統所支持的硬件特性描述符。 如果應用程序需要聲明對某個硬件特性的使用需求,只要在一項 <uses-feature> 元素的 android:name 屬性值中聲明某個對應的描述符即可。
| 種類 | 描述符 | 說明 | 備注 |
|---|---|---|---|
| 音頻設備 | android.hardware.audio.low_latency |
應用程序用到低延遲音頻通道,並對聲音的輸入輸出延遲較為敏感。 | |
| 藍牙 | android.hardware.bluetooth |
應用程序用到藍牙通訊特性。 | |
android.hardware.bluetooth_le |
應用程序用到低功耗藍牙通訊特性 | ||
| 攝像頭 | android.hardware.camera |
應用程序用到攝像頭。如果設備支持多個攝像頭,則使用屏幕背面的后置攝像頭。 | |
android.hardware.camera.autofocus |
子特性。應用程序用到攝像頭的自動對焦功能。 | 這些子特性隱含聲明了父特性 android.hardware.camera, 除非同時附帶聲明了android:required="false"。 |
|
android.hardware.camera.flash |
子特性。應用程序用到攝像頭的閃光燈功能。 | ||
android.hardware.camera.front |
子特性。應用程序用到正面的前置攝像頭。 | ||
android.hardware.camera.any |
應用程序至少用到一個攝像頭,無所謂其朝向,如果有連接的外置攝像頭也可以。 如果不是非要使用后置攝像頭的話,可優先選用本設置,而不是 android.hardware.camera。 |
||
android.hardware.camera.external |
如果存在的話,應用程序使用外置攝像頭。 | ||
| 紅外 | android.hardware.consumerir |
應用程序用到紅外(Consumer IR) 功能。 | |
| 定位 | android.hardware.location |
應用程序用到一個以上的定位特性,例如 GPS 定位、網絡定位或基站定位。 | |
android.hardware.location.network |
子特性。應用程序用到粗略的定位坐標,此坐標來自基於網絡的定位系統。 | 這些子特性隱含聲明了父特性 android.hardware.location, 除非同時附帶聲明了android:required="false"。 |
|
android.hardware.location.gps |
子特性。應用程序用到精確的定位坐標,此坐標來自全球定位系統 GPS 接收器。 | ||
| 話筒 | android.hardware.microphone |
應用程序用到話筒。 | |
| NFC | android.hardware.nfc |
應用程序用到近場無線通信(NFC)特性。 | |
android.hardware.nfc.hce |
應用程序用到 NFC 卡仿真特性 | ||
| 傳感器 | android.hardware.sensor.accelerometer |
應用程序用到加速度傳感器給出的運動數據。 | |
android.hardware.sensor.barometer |
應用程序用到氣壓傳感器。 | ||
android.hardware.sensor.compass |
應用程序用到來自地磁傳感器(羅盤)給出的方向數據。 | ||
android.hardware.sensor.gyroscope |
應用程序用到陀螺儀傳感器。 | ||
android.hardware.sensor.light |
應用程序用到光線傳感器。 | ||
android.hardware.sensor.proximity |
應用程序用到接近度傳感器。 | ||
android.hardware.sensor.stepcounter |
應用程序用到走步計數器。 | ||
android.hardware.sensor.stepdetector |
應用程序用到了走步探測器。 | ||
| 屏幕 | android.hardware.screen.landscape |
應用程序需要設備橫向放置。 | 例如,如果程序需要縱向屏幕,應該聲明 默認情況下,兩種方向都不是必需的,這樣在支持一個或兩個方向的設備上都可以安裝應用程序。 不過,只要有 Activity 需要運行於指定的方向上,並使用了 為了保持向下兼容,任何運行 API 級別 12 以下版本系統的設備,都被視為同時支持橫向和縱向放置。 |
android.hardware.screen.portrait |
應用程序需要設備縱向放置。 | ||
| 電話 | android.hardware.telephony |
應用程序用到電話特性,比如電話的數據通訊服務。 | |
android.hardware.telephony.cdma |
子特性。應用程序用到 CDMA 電話特性。 | 這些子特性隱含聲明了父特性 android.hardware.telephony, 除非附帶了 android:required="false" 聲明。 |
|
android.hardware.telephony.gsm |
子特性。應用程序用到 GSM 電話特性。 | ||
| 電視 | android.hardware.type.television |
應用程序設計為電視機用戶的體驗方式。 | 本特性的“television”定義為典型的客廳電視用戶體驗方式: 大屏幕顯示,用戶可坐得更遠,主要的輸入方式是方向鍵之類,一般不使用觸摸屏或鼠標(指點設備)。 |
| 觸摸屏 | android.hardware.faketouch |
應用程序用到了基本的觸摸交互事件,比如“按下”、“抬起”和拖動。 | 一經聲明,即表示應用程序兼容那些僅提供了仿真觸摸屏(偽觸摸屏)或更高級觸摸屏的設備。 提供偽觸摸屏的設備可向用戶提供一種模仿了部分觸摸屏功能的錄入系統。 比如,可控制屏幕光標的鼠標或遙控器就提供了偽觸摸屏功能。 如果應用程序需要基本的指點和點擊交互(換句話說,僅用方向鍵是無法正常工作的),就應該聲明本特性。 因為這是最低級別的觸摸交互方式,應用程序也將能兼容那些可提供更復雜觸摸交互方式的設備。 注意: 由於應用程序默認是需要 |
android.hardware.faketouch.multitouch.distinct |
應用程序在偽觸摸屏上對兩個以上的手指進行獨立的跟蹤。 這是 faketouch 的子特性。 | 一經聲明,即表示應用程序兼容那些僅能獨立跟蹤兩個以上手指操作事件的仿真觸摸屏或更高級的設備。 與 |
|
android.hardware.faketouch.multitouch.jazzhand |
應用程序在偽觸摸屏上對五個以上的手指進行獨立的跟蹤。 這是 faketouch 的子特性。 | 一經聲明,即表示應用程序兼容那些僅能獨立跟蹤五個以上手指操作事件的仿真觸摸設備。 與 |
|
android.hardware.touchscreen |
應用程序用到比基本觸摸事件更加復雜的手勢觸摸功能,比如滑動。 這是基本 faketouch 特性的超集。 | 默認情況下,應用程序是必須使用本特性的。 這樣,應用程序默認就不適用於那些僅能仿真觸摸接口(fake touch)的設備。 如果應用程序需要能夠適用於提供仿真觸摸接口的設備(甚至是僅提供方向鍵的設備),則必須用帶有 如果應用程序確實需要觸摸屏接口(為了處理滑動之類的觸摸手勢),就不必進行任何聲明,因為默認這就是必需的。 不過,最好還是對所有要用到的特性都進行顯式聲明,因此必要的話還是應該聲明本特性。 如果需要用到更復雜的觸摸操作,比如多個手指的手勢,則應該聲明后續的更為高級的觸摸屏特性。 |
|
android.hardware.touchscreen.multitouch |
應用程序用到基本的兩點觸摸功能(比如夾的手勢),但不需要多點獨立跟蹤。 這是 touchscreen 特性的超集。 | 本特性隱含聲明了父特性 android.hardware.touchscreen,除非同時附帶了 android:required="false" 聲明。 |
|
android.hardware.touchscreen.multitouch.distinct |
子特性。應用程序用到了高級的多點觸摸功能,比如完全獨立地跟蹤兩個以上的觸點軌跡。 這是 multitouch 特性的超集。 | 本特性隱含聲明了父特性android.hardware.touchscreen.multitouch, 除非同時附帶了 android:required="false" 聲明。 |
|
android.hardware.touchscreen.multitouch.jazzhand |
應用程序用到了高級的多點觸摸功能,需要完全跟蹤不超過五個觸點的軌跡。 這是 distinct 多點觸摸特性的超集。 | ||
| USB | android.hardware.usb.host |
應用程序用到 USB 主機模式特性(作為接受 USB 設備連接的主機)。 | |
android.hardware.usb.accessory |
應用程序用到 USB 訪問特性(作為 USB 設備並去連接 USB 主機)。 | ||
| Wi-Fi | android.hardware.wifi |
應用程序用到 802.11 網絡(Wi-Fi)特性。 | |
android.hardware.wifi.direct |
應用程序用到 Wi-Fi Direct 網絡特性。 |
軟件特性
下表對最新版本系統支持的軟件特性描述符給出了說明。 如果應用程序需要聲明對某個軟件特性的使用需求,只要在一項 <uses-feature> 元素的 android:name 屬性值中聲明某個對應的描述符即可。
| 特性 | 屬性值 | 說明 |
|---|---|---|
| App Widget | android.software.app_widgets |
應用程序使用或提供了 App Widget,並且只能安裝到提供主屏幕或類似地方的設備上, 用戶可以在這個地方嵌入多個 App Widget。 |
| 設備管理 | android.software.device_admin |
應用程序通過設備管理器使用設備強制策略。 |
| 主屏幕 | android.software.home_screen |
應用程序可替代主屏幕運行,且僅能在支持第三方主屏幕應用的設備上安裝。 |
| 輸入手段 | android.software.input_methods |
應用程序提供了自定義的輸入手段,且僅能在支持第三方輸入手段的設備上安裝。 |
| 活動壁紙 | android.software.live_wallpaper |
應用程序用到或提供活動壁紙功能,且僅能在支持活動壁紙的設備上安裝。 |
| SIP/VOIP | android.software.sip |
應用程序用到 SIP 服務,且僅能在支持 SIP 的設備上安裝。 |
android.software.sip.voip |
子特性。應用程序用到基於 SIP 的 VOIP 服務。 本特性隱含聲明了父特性 |
隱含了特性需求的權限
上述表格中的某些特性常量只適用於對應版本 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 特性, 並會建立基於此特性的過濾機制。
下表列出了隱含了特性需求的權限,等同於這些特性已經在 <uses-feature> 元素中聲明了。 請注意, <uses-feature> 的聲明(包括所有帶有 android:required 屬性的聲明) 總是優先於下述權限隱含的特性需求。
下述所有的權限,都可以禁用基於隱含聲明的過濾行為, 這通過聲明附帶 android:required="false" 屬性的 <uses-feature> 元素來實現。 例如,為了禁用基於 CAMERA 權限的過濾行為,可以在 Manifest 文件中加入以下 <uses-feature> 聲明:
<uses-feature android:name="android.hardware.camera" android:required="false" />
| 種類 | 權限 | 隱含的特性需求 |
|---|---|---|
| 藍牙 | 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.network 和 android.hardware.location |
|
ACCESS_FINE_LOCATION |
android.hardware.location.gps 和 android.hardware.location |
|
| 話筒 | 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 |
