標簽: android開發者指南manifest.xmluses-featureit |
分類: Android |
<uses-feature>
版本:Android 3.2
Android Market和<uses-feature>元素
Android Market會對用戶所見到的應用程序進行過濾,因此用戶只能看見並下載那些與自己設備兼容的應用程序。Market過濾應用的一種方式是根據feature的兼容性。
為了實現feature的過濾,Market會檢查每個應用程序manifest文件的<uses-feature>元素,並建立feature需求。然后根據用戶設備可用的feature,Market對用戶顯示或隱藏應用程序。
通過指定應用程序所需的feature,可以讓Android Market只向符合feature需求的設備提供應用程序,而不是提供給所有用戶。
關於Android Market如何將features用作過濾條件的重要信息,請參閱下文Android Market和基於Feature的過濾。
語法:
<uses-featureandroid:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer"/>
包含於:
說明:
聲明一個應用程序用到的軟硬件特性feature。
聲明<uses-feature>的目的是為了把應用程序所依賴的軟硬件特性feature通知給外部實體。本元素提供一個required屬性,指定應用程序是否必需此feature,即不聲明此feature的話就無法正常運行;或者雖然期望提供此feature,不過沒有的話也能運行。由於對feature的支持依Android設備而各不相同,<uses-feature>元素將為應用程序描述所需的各種設備feature發揮重要作用。
應用程序聲明的可用feature集應與Android PackageManager中的feature常量集相一致,在本文底部的Feature參考表中已列出以便查找。
由於每一個feature必須放在單獨的元素中指定,如果應用程序需要多個feature,應該聲明多個<uses-feature>元素。比如,應用程序需要使用設備中的藍牙和攝像頭,則應聲明兩個元素:
<uses-featureandroid:name="android.hardware.bluetooth"/>
<uses-featureandroid:name="android.hardware.camera"/>
通常應確保總是為程序需要的所有feature都聲明<uses-feature>元素。
<uses-feature>元素的聲明僅僅是通知性質的,這意味着Android系統本身不會在安裝程序前檢查設備是否支持feature。當然,其它服務(諸如Android Market)或者應用程序可以檢查此<uses-feature>聲明來進行處理或與本應用程序進行交互。因此,聲明需用到的所有feature(如下表列出)是非常重要的。
有些feature可能會擁有特殊的屬性,用於定義feature的版本,比如Open GL版本(用glEsVersion聲明)。其它的設備feature,比如攝像頭,用name屬性進行聲明。
盡管<uses-feature>元素僅對API Level 4以上版本的設備才有效,仍然建議為所有應用程序包含本元素,即使minSdkVersion小於等於“3”也應如此。運行早期版本的設備將會忽略本元素。
注意:如果聲明了一個feature,請記得必須同時請求響應的權限。比如在訪問攝像頭APi之前,還必須申請CAMERA權限。權限申請可向應用程序授權訪問相應軟硬件,而聲明應用程序所用到的feature可以確保合適的設備兼容性。
屬性:
指定一個應用程序所用到的軟、硬件feature,用作描述符。合法的描述符值在下文的硬件feature和軟件feature 表中列出。
android:required
布爾值,指明應用程序是否需要android:name指定的feature。
· 如果對feature聲明了"android:required="true",則表示設備不提供指定feature應用程序就不能正常運行或未設計成正常運行。
· 如果對feature聲明了"android:required="false",則意味着設備提供則應用程序願意使用此feature,但程序是為不存在指定feature也能正常工作而設計的。
如果未聲明android:required,則缺省值是"true"。
android:glEsVersion
應用程序所需的OpenGL ES版本。高16位代表大版本號,低16位代表小版本號。比如要指定OpenGL ES 2.0,應該設為“0x00020000”。要指定OpenGL ES 2.1,應該設為“0x00020001”。
應用程序應該在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可用。)
引入於:
API Level 4
參閱:
Android Market會對用戶所見到的應用程序進行過濾,因此用戶只能看到並下載與自己的設備兼容的那些應用程序。Market過濾應用的一種方式是根據feature兼容性。
為了確定應用程序的feature與給定用戶設備的兼容性,Android Market服務將對比:
· 應用程序所需的feature——應用程序在manifest的<uses-feature>元素中聲明的feature 和
· 設備可用的硬件或軟件feature——設備以系統只讀屬性報告的所支持的feature。
為了確保feature的精確匹配,Android包管理器提供了一組共享的feature常量集,應用程序和設備都能用它來聲明feature需求及支持。可用的feature常量已在本文底部的Features參考表中列出,同時也列在PackageManager類的文檔中。
當用戶啟動Market應用程序時,它會查詢包管理器並通過調用getSystemAvailableFeatures()列出設備可用的feature。在與用戶建立連接后,Market應用程序會把feature列表上傳給Android Market服務。
每次把應用程序上傳給Android Market發布網站時,Android Market會掃描應用程序的manifest文件。它會查找<uses-feature>元素並綜合其它元素進行判斷,比如<uses-sdk>和<uses-permission>元素。建立應用程序所需的feature集之后,它會將此列表作為與應用程序.apk及版本相關聯的元數據進行內部保存。
當用戶在Android Market上搜索或查看應用程序時,后台服務會把程序需要的feature與用戶設備可用的feature進行比較。如果對程序所需的所有feature設備都能提供,Android Market就允許用戶看見此應用並提供下載。只要任一個所需的feature不能被設備支持,Android Market就會濾除這個應用,用戶看不到此應用程序也無法下載它。
因為在<uses-feature>元素中聲明的feature直接會影響Android Market對應用程序的過濾,理解Android Market如何判斷應用程序的manifest並建立所需的feature集,是非常重要的。以下章節提供了更為詳細的信息。
基於顯式聲明的feature進行過濾
已顯式聲明的feature是指應用程序在<uses-feature>元素中聲明過的feature。feature的聲明可以包含一個android:required=["true" | "false"]屬性(假定是以API level 5以上版本編譯),此屬性可以指明應用程序是否一定需要本feature,也即不為("true")的話就無法正常運行;或者應用程序在feature可用時是否期望使用它,但設計為不為("false")情況下運行的。(譯者注:此處意思似乎與前文android:required的說明不符,應該是為false時而設計。)
Android Market用以下方式處理顯式聲明過的feature:
· 如果feature顯式聲明為必需的,Android Market將把此feature加入應用程序的feature需求列表中,然后對用戶濾除那些設備不支持此feature的應用程序。例如:
<uses-featureandroid:name="android.hardware.camera"android:required="true"/>
· 如果feature顯式聲明為不需要。Android Market將不會把此feature加入到feature需求列表中。因此,對應用程序的過濾會忽略那些顯式聲明為不需要的feature。即使設備不支持已聲明的feature,但只要其它過濾條件許可,Android Market仍然會考慮應用程序與設備的兼容性並顯示給用戶。例如:
<uses-featureandroid:name="android.hardware.camera"android:required="false"/>
· 如果feature已顯式聲明,但卻不帶有android:required屬性,Android Market將假定此feature是必需的並根據它進行過濾。
一般情況下,如果應用程序是設計為在Android 1.6以下版本運行的,則API是不支持android:required屬性的,Android Market假定所有的<uses-feature>聲明都是必需的。
注意:通過顯式聲明feature並包含android:required="false"屬性,可以有效地禁止Android Market針對指定feature的所有過濾行為。
基於隱含feature進行過濾
隱含feature是指應用程序正常運行所必需的,但不在manifest文件的<uses-feature>元素中聲明的那些feature。從嚴格意義上說,每個應用程序應該總是對其需要的或用到的所有feature進行聲明,所以對用到的feature缺少聲明應該是被視為錯誤。然而作為對用戶和開發人員的保護措施,Android Market會查找每個應用程序的隱含feature並為其建立過濾器,就如這些feature已經顯式聲明過一樣。
因為以下原因,應用程序可能未對必需的feature進行聲明:
· 應用程序是用低版本Android庫(Android 1.5以下)編譯的,當時<uses-feature>元素還未獲支持。
· 開發人員錯誤地認為所有設備都應提供此feature,也就沒必要聲明了。
· 開發人員無意中遺漏了feature聲明。
· 開發人員顯示聲明了feature但聲明不合法。比如,<uses-feature>元素名稱拼寫錯誤,或把無法識別的字符串賦值給android:name屬性,都會導致聲明不合法。
為了考慮以上這些情況,Android Market試圖通過檢查manifest文件中的其它元素來發現應用程序隱含的feature需求,特別是<uses-permission>元素。
如果應用程序請求了硬件相關的訪問權限,即使缺少相應的<uses-feature>聲明,Android
Market也會假定應用程序會使用底層硬件feature並需要這些feature。根據這些權限,Android Market把對應的底層硬件feature加入到應用程序的元數據中並為其建立過濾器。
例如,假設應用程序請求CAMERA權限但未對android.hardware.camera聲明<uses-feature>元素,Android Market就認為應用程序需要攝像頭,對於設備不提供攝像頭的用戶就不會顯示出此程序。
如果不希望Android Market根據隱含的feature進行過濾,也可以禁用此功能,只要在<uses-feature>元素中顯式聲明feature並包含android:required="false"屬性即可。例如:要禁用源自CAMERA權限的過濾,可以如下聲明feature:
<uses-featureandroid:name="android.hardware.camera"android:required="false"/>
<uses-permission>元素中的權限請求可能直接影響Android Market對應用程序的過濾行為,理解這一點十分重要。下文隱含了Feature需求的權限章節列出了所有隱含feature需求且會觸發過濾行為的權限列表。
對藍牙feature的特殊處理
在對藍牙feature確定過濾條件時,Android Market應用的規則與上述稍有差別。
如果應用程序在<uses-permission>元素中聲明了Bluetooth權限,但未在<uses-feature>元素中顯式聲明Bluetooth feature,Android Market將檢查應用程序設計運行的在<uses-sdk>元素中指定的Android平台版本。
如下表所列,僅當程序聲明了最低版本為Android 2.0 (API level 5)以上時,Android Market才會啟用對藍牙feature的過濾。當然請注意,如果程序在<uses-feature>元素中顯式聲明了Bluetooth feature,Android Market仍將適用正常過濾規則。
表1。對已請求藍牙權限但未在<uses-feature>元素中聲明Bluetooth feature的應用程序,Android Market如何確定藍牙feature需求。
如果minSdkVersion是 |
或者 targetSdkVersion是 |
結果 |
<=4 (或未聲明uses-sdk) |
<=4 |
Android Market將不過濾應用程序(根據設備報告的對android.hardware.bluetooth feature的支持)。 |
<=4 |
>=5 |
Android Market對不支持android.hardware.bluetooth feature的設備(包括低版本平台)將濾除應用程序。 |
>=5 |
>=5 |
根據Android Market如何處理藍牙feature,以下例子展示了各種過濾的效果。
第一例中,應用程序是設計運行於低版本API,聲明了Bluetooth權限,但未在元素中聲明Bluetooth feature。
結果:Android Market不對任何設備進行過濾。
<manifest ...>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-sdkandroid:minSdkVersion="3"/>
...
</manifest>
下面的第二例中,還是同一個程序但聲明了目標API level是 "5"。
結果:Android Market現在假定需要藍牙feature,並將對未報告支持藍牙的設備進行濾除,包括那些運行低版本平台的設備。
<manifest ...>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-sdkandroid:minSdkVersion="3"android:targetSdkVersion="5"/>
...
</manifest>
下面還是同一個程序,但現在特地聲明了Bluetooth feature。
結果:與前例相同(過濾生效)。
<manifest ...>
<uses-featureandroid:name="android.hardware.bluetooth"/>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-sdkandroid:minSdkVersion="3"android:targetSdkVersion="5"/>
...
</manifest>
最后,以下情況還是同一個程序,但增加了android:required="false"屬性。
結果:Android Market對所有設備關閉基於Bluetooth feature支持的過濾,
<manifest ...>
<uses-featureandroid:name="android.hardware.bluetooth"android:required="false"/>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-sdkandroid:minSdkVersion="3"android:targetSdkVersion="5"/>
...
</manifest>
測試應用程序所需的feature
可以用Android SDK內含的aapt工具來確定Android Market是否會根據聲明的feature和權限濾除應用程序,帶dump badging命令行參數運行aapt即可。這會使得aapt解析manifest文件並應用與Android Market相同的規則來確定程序所需的feature。
請按以下步驟使用此工具:
首先,創建程序並生成未簽名的.apk。如果使用帶ADT的Eclipse進行開發,右鍵點擊project並選擇Android Tools > Export Unsigned Application Package。選中目標文件名和路徑並點擊OK。
1. 下一步,如果未在PATH中包含運行路徑,則找到aapt工具。如果正在使用SDK Tools r8以上版本,可以在<SDK>/platform-tools/目錄下找到aapt。
注意:必須使用最新版本Platform-Tools組件所提供的aapt。如果沒有最新版本的Platform-Tools組件,用Android SDK和AVD Manager去下載。
2. 用以下格式運行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'
下表列出了軟硬件feature信息及可在Android Market中隱含feature的權限。
下表說明了平台當前大多數版本所支持的硬件feature描述符。用於程序中的標識或者聲明硬件feature的需求,在單獨的<uses-feature>元素中聲明android:name屬性值即可。
Feature類型 |
Feature描述符 |
說明 |
備注 |
Audio |
android.hardware.audio.low_latency |
應用程序用到設備上的低延遲音頻通道,並對聲音的輸入輸出延遲較為敏感。 |
|
Bluetooth |
android.hardware.bluetooth |
應用程序用到設備的藍牙無線feature。 |
|
Camera |
android.hardware.camera |
應用程序用到設備的攝像頭。如果設備支持多個攝像頭,程序使用背朝屏幕的那個。 |
|
android.hardware.camera.autofocus |
子特性。應用程序用到設備攝像頭的自動對焦功能。 |
這些子特性隱含聲明了父featureandroid.hardware.camera,除非它聲明了android:required="false"。 |
|
android.hardware.camera.flash |
子特性。應用程序用到設備攝像頭的閃光燈功能。 |
||
android.hardware.camera.front |
子特性。應用程序用到設備上正面的攝像頭。 |
||
Location |
android.hardware.location |
應用程序用到設備上一個或多個定位feature,例如GPS定位、網絡定位或蜂窩定位。 |
|
android.hardware.location.network |
子特性。應用程序用到粗略的位置坐標,此坐標來源於設備支持的基於網絡的定位系統。 |
這些子特性隱含聲明了父featureandroid.hardware.location,除非它聲明了android:required="false"。 |
|
android.hardware.location.gps |
子特性。應用程序用到精確的位置坐標,此坐標來源於設備上的全球定位系統GPS接收器。 |
||
Microphone |
android.hardware.microphone |
應用程序用到設備上的話筒。 |
|
NFC |
android.hardware.nfc |
應用程序用到設備上的近距離無線通信Near Field Communication features。 |
|
Sensors |
android.hardware.sensor.accelerometer |
應用程序用到來自設備上加速度傳感器的動作數據。 |
|
android.hardware.sensor.barometer |
應用程序用到設備上的氣壓計。 |
||
android.hardware.sensor.compass |
應用程序用到來自設備上磁力指南針的方向數據。 |
||
android.hardware.sensor.gyroscope |
應用程序用到設備上的陀螺傳感器。 |
||
android.hardware.sensor.light |
應用程序用到設備上的光線傳感器。 |
||
android.hardware.sensor.proximity |
應用程序用到設備上的臨近性傳感器。 |
||
Screen |
android.hardware.screen.landscape |
應用程序需要屏幕橫向放置。 |
比如,假設程序需要縱向屏幕,可以聲明<uses-feature android:name="android.hardware.screen.portrait"/>,則只有支持縱向屏幕的設備(一直縱向或用戶選擇都可以)才能安裝此程序。假如程序對兩種方向都支持,則一個方向都不需要聲明。缺省情況下,兩種方向都不是必需的,因此程序在支持一個或兩個方向的設備上都可以安裝。不過,如果任一activity需要運行在特定方向,並使用了android:screenOrientation屬性,則表明程序必需此特定方向。例如,假設聲明了帶"landscape"、 "reverseLandscape"或"sensorLandscape"的android:screenOrientation ,則程序將只能用於支持橫向顯示的設備。最好還是用<uses-feature>元素聲明此方向的需求。如果用android:screenOrientation為activity聲明了方向,但實際上卻不需要用到,可以通過包含android:required="false"的<uses-feature>方向聲明來禁用此需求。 為了保持向下兼容性,任何運行API level 12以下版本平台的設備,被認為是對橫向和縱向都能提供支持。 |
android.hardware.screen.portrait |
應用程序需要屏幕縱向放置。 |
||
Telephony |
android.hardware.telephony |
應用程序用到設備上的電話feature,諸如電話的無線數據通訊服務。 |
|
android.hardware.telephony.cdma |
子特性。應用程序用到設備上的CDMA 電話無線feature。 |
這些子特性隱含聲明了父feature android.hardware.telephony,除非它用android:required="false"進行了聲明。 |
|
android.hardware.telephony.gsm |
子特性。應用程序用到設備上GSM電話無線feature。 |
||
Touchscreen |
android.hardware.faketouch |
應用程序用到了基本的觸摸交互事件,諸如“按下”、“抬起”和拖動。 |
此聲明表示應用程序只適用於支持仿真觸摸(偽觸摸屏faketouch)或更高級觸摸屏的設備。 支持偽觸摸屏界面的設備能向用戶提供一種模仿了部分觸摸屏功能的錄入系統。比如,控制屏幕光標的鼠標或遙控器就提供了偽觸摸接口。如果應用程序需要基本的點擊交互(換句話說,僅用D-pad是無法正常運行的),就應該聲明本feature。因為這是最低級別的觸摸交互方式,應用程序也將能兼容支持更復雜觸摸交互功能的設備。 注意:因為應用程序缺省是需要android.hardware.touchscreen feature的,如果期望程序適用於偽觸摸接口,必須同時顯式聲明觸摸屏不是必需的:<uses-feature android:name="android.hardware.touchscreen" android:required="false" /> |
android.hardware.faketouch.multitouch.distinct |
應用程序在偽觸摸屏上對兩個以上的手指進行獨立的跟蹤。這是faketouch的子特性。 |
聲明此feature表示應用程序只適用於能支持單獨跟蹤兩個手指以上軌跡的觸摸仿真或更高級的設備上。 與android.hardware.touchscreen.multitouch.distinct定義的獨立多點觸摸不同,以偽觸摸接口方式支持多點觸摸的輸入設備將不支持全部的雙手指手勢,因為輸入實際上是轉換成屏幕光標的移動的。也就是說,在這種設備上單個手指的手勢將會移動光標;雙手指的點擊將觸發單個手指的觸摸事件;其它雙手指的手勢將導致雙手指觸摸事件沖突。用偽觸摸接口支持獨立多點觸摸的設備,一個例子就是移動光標的軌跡板,它同時也支持兩個以上手指的觸摸。 |
|
android.hardware.faketouch.multitouch.jazzhand |
應用程序在偽觸摸屏上對五個以上的手指進行獨立的跟蹤。這是faketouch的子特性。 |
聲明此feature表示應用程序只適用於能支持單獨跟蹤五個以上手指軌跡的觸摸仿真或更高級的設備上。 與android.hardware.touchscreen.multitouch.jazzhand定義的獨立jazzhand多點觸摸不同,以偽觸摸接口方式支持的jazzhand多點觸摸不支持全部的五手指手勢,因為輸入會轉換成屏幕的光標移動。也就是說,在這種設備上單個手指的手勢將會移動光標;多手指的手勢將觸發單個手指的觸摸事件;其它多手指的手勢將會導致多手指觸摸事件的沖突。用偽觸摸接口支持獨立多點觸摸的設備,一個例子就是移動光標的軌跡板,它同時也支持五個以上手指的觸摸。 |
|
android.hardware.touchscreen |
應用程序用到比基本的觸摸事件更復雜的手勢觸摸功能,比如滑動(fling)。這是基本faketouch feature的超集。 |
缺省情況下,應用程序是需要本feature的。這樣應用程序默認不適用於僅能支持仿真觸摸接口(fake touch)的設備。如果程序期望能用於支持仿真觸摸接口的設備(甚至是僅提供d-pad的設備),必須用附帶android:required="false"的android.hardware.touchscreen顯式聲明不需要觸摸屏。即使程序是用到了——但不需要——真正的觸摸屏接口,也需要如此顯式聲明。 如果應用程序確實需要觸摸屏接口(為了處理諸如fling之類的觸摸手勢),就不必進行任何聲明,因為這是缺省必需的。不過最好對所有用到的feature都進行顯式聲明,所以用到的話還是應該聲明本feature。 如果需要更復雜的觸摸操作,比如多個手指的手勢,應該聲明下面更高級的觸摸屏feature。 |
|
android.hardware.touchscreen.multitouch |
應用程序用到基本的兩點觸摸功能,比如夾pinch手勢,但不需要單獨的跟蹤觸摸。這是touchscreen feature 的超集。 |
隱含聲明了父feature android.hardware.touchscreen,除非聲明時附帶了android:required="false"。 |
|
android.hardware.touchscreen.multitouch.distinct |
子特性。應用程序用到了高級 多點觸摸功能,比如完全獨立地跟蹤兩個以上的觸點。這是multitouch feature的超集。 |
隱含聲明了父feature android.hardware.touchscreen.multitouch,除非聲明時附帶了android:required="false"。 |
|
android.hardware.touchscreen.multitouch.jazzhand |
應用程序用到了高級 多點觸摸功能,完全獨立地跟蹤跟蹤不超過5個點。這是 distinct multitouch feature 的超集。 |
||
USB |
android.hardware.usb.host |
應用程序用到了USB主機模式feature(作為主機連接USB設備)。 |
|
android.hardware.usb.accessory |
應用程序用到了USB訪問feature(作為USB設備連接USB主機)。 |
||
Wifi |
android.hardware.wifi |
應用程序用到了設備上的802.11 網絡(wifi)feature。 |
下表說明了平台目前的版本所支持的軟件feature描述符。用於程序中的標識或者聲明軟件feature的需求,在單獨的<uses-feature>元素中聲明android:name屬性值即可。
Feature |
屬性值 |
說明 |
備注 |
Live Wallpaper |
android.software.live_wallpaper |
應用程序用到或支持活動桌面壁紙Live Wallpapers。 |
|
SIP/VOIP |
android.software.sip |
應用程序用到設備上的會話發起協議SIP服務。 |
|
android.software.sip.voip |
子個性。應用程序用到設備上基於SIP的網絡電話VOIP服務。 |
本feature隱含聲明了父feature android.software.sip,除非聲明附帶了android:required="false"。 |
上表中的某些feature常量只適用於相應API版本之后的應用;比如android.hardware.bluetooth feature是Android 2.2 (API level 8)加入的,但它所用到的藍牙API在Android 2.0 (API level 5)就已經加入了。因此,在能通過<uses-feature>系統來聲明所需的API之前,應用程序已經可以使用這些API
為了保證這些應用程序的可用性,Android Market假定某些特定的硬件權限默認就標明了對底層硬件feature的需求。舉例來說,用到藍牙的應用程序必須在<uses-permission>元素中請求BLUETOOTH權限——用於老版本應用,Android Market認為此權限聲明意味着程序需要底層android.hardware.bluetooth feature,並會建立基於此feature的過濾行為。
下表列出了隱含了feature需求聲明的權限,等同於<uses-feature>元素聲明的feature。請注意,包含了android:required屬性的<uses-feature>聲明總是會優先於一下權限隱含的feature。
對於以下所有權限,通過附帶android:required="false"屬性的<uses-feature>元素,都可以禁用基於隱含聲明的過濾。例如,要禁用基於CAMERA權限的過濾行為,可以在<uses-feature>中加入以下聲明來實現:
<uses-featureandroid:name="android.hardware.camera"android:required="false"/>
種類 |
權限 |
隱含的Feature需求 |
Bluetooth |
BLUETOOTH |
android.hardware.bluetooth (詳見藍牙feature特殊處理) |
BLUETOOTH_ADMIN |
android.hardware.bluetooth |
|
Camera |
CAMERA |
android.hardware.camera和android.hardware.camera.autofocus |
Location |
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 |
|
Microphone |
RECORD_AUDIO |
android.hardware.microphone |
Telephony |
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 |
|
Wifi |
ACCESS_WIFI_STATE |
android.hardware.wifi |
CHANGE_WIFI_STATE |
android.hardware.wifi |
|
CHANGE_WIFI_MULTICAST_STATE |
android.hardware.wifi |