Android開發-API指南-

<uses-feature>

英文原文:http://developer.android.com/guide/topics/manifest/uses-feature-element.html
採集(更新)日期:2014-7-7
搬遷自原博客:http://blog.sina.com.cn/s/blog_48d491300100zmwf.htmlhtml

語法:
<uses-feature 
  android:name="string" 
  android:required=["true" | "false"] 
  android:glEsVersion="integer" /> 
包含於:
<manifest>
說明:
聲明一項應用程序須要用到的軟、硬件特性。

聲明一項 <uses-feature> 的目的,是爲了把應用程序所依賴的軟硬件特性告知應用程序以外的對象。 本元素給出了一個 required 屬性, 用於指定應用程序是否必需該項特性,也即不聲明該項特性的話就沒法正常運行; 或者最好是提供該項特性,但沒有的話也能運行。 因爲每種 Android 設備提供的特性各不相同, <uses-feature> 元素髮揮着重要做用, 應用程序能夠用它來描述其用到的各類設備特性。工具

應用程序聲明的多項設備特性應該對應於 Android PackageManager 中的相關常量,爲了方便起見,在本文最後的 Features 參考手冊中已將這些常量列出。post

因爲每一項設備特性必須放在獨立的一條 <uses-feature> 元素中聲明, 若是應用程序須要用到多項特性,就須要聲明多個 <uses-feature> 元素。 例如,假設應用程序須要使用藍牙和攝像頭設備,則應聲明兩個元素:測試

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

一般,應該確保爲應用程序須要的全部特性均聲明瞭 <uses-feature> 元素。ui

<uses-feature> 元素的聲明僅僅是告知性質的,這意味着 Android 系統自己不會在安裝程序前檢查設備是否支持這些特性。 不過,其餘服務(如 Google Play )或者其餘應用程序能夠檢查 <uses-feature> 聲明來進行相應處理或與本應用程序進行交互。 所以,對須要用到的全部特性都進行聲明(以下表所示)是很是重要的。google

有些設備特性可能會存在一些特殊的屬性,用於定義該特性的版本,好比 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 的規則來肯定應用程序須要的設備特性。

請按如下步驟使用此工具:

  1. 首先,建立程序並生成未簽名的 .apk。 若是使用帶 ADT 的 Eclipse 進行開發,請右鍵點擊 project 並選擇 Android Tools > Export Unsigned Application Package。 選中目標文件名和路徑並點擊 OK 。
  2. 其次,若是未在 PATH 環境變量中包含 aapt 工具的路徑,則請定位到其所在目錄。 若是正在使用的 SDK 工具爲 r8 以上版本,則能夠在 <SDK> /platform-tools/ 目錄中找到 aapt

    注意: 必須使用最新版的 Platform-Tool 組件所提供的 aapt 。 若是沒有最新版本的 Platform-Tool 組件,請用 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'
複製代碼

設備特性參考手冊


下列表格列出了與軟、硬件特性相關的參考信息,以及可在 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 應用程序須要設備橫向放置。

例如,若是程序須要縱向屏幕,應該聲明 <uses-feature android:name="android.hardware.screen.portrait"/> , 這樣只有提供縱向屏幕的設備(一直縱向或用戶選擇的縱向均可以)才能安裝該應用程序。 假如應用程序支持兩種方向,那就一個方向都不要聲明。

默認狀況下,兩種方向都不是必需的,這樣在支持一個或兩個方向的設備上均可以安裝應用程序。 不過,只要有 Activity 須要運行於指定的方向上,並使用了 android:screenOrientation 屬性,則代表該應用程序必需這個屏幕方向。 例如,若是應用程序聲明瞭帶「landscape」、 「reverseLandscape」或「sensorLandscape」的 android:screenOrientation 屬性,則該程序將僅適用於支持橫向顯示的設備。 最好仍是用 <uses-feature> 元素聲明這種屏幕方向的需求。 若是用 android:screenOrientation 爲 Activity 聲明瞭屏幕方向,但實際上卻不是必須用到,則能夠禁用此需求,這經過用 <uses-feature> 聲明方向需求並附帶android:required="false"來實現。

爲了保持向下兼容,任何運行 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.touchscreen 特性的, 若是應用程序須要適用於提供僞觸摸方式的設備,則必須同時顯式聲明觸摸屏不是必需的, 這可經過聲明 <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> 來完成。

android.hardware.faketouch.multitouch.distinct 應用程序在僞觸摸屏上對兩個以上的手指進行獨立的跟蹤。 這是 faketouch 的子特性。

一經聲明,即表示應用程序兼容那些僅能獨立跟蹤兩個以上手指操做事件的仿真觸摸屏或更高級的設備。

與 android.hardware.touchscreen.multitouch.distinct 定義的獨立多點觸摸方式不一樣, 以僞觸摸方式實現的多點觸摸輸入設備將不支持所有的雙手指手勢,由於這種輸入方式其實是轉換爲屏幕光標的移動的。 也就是說,在這種設備上,單個手指的手勢將會移動光標,兩個手指的點擊將觸發單手指觸摸事件;其餘的雙手指手勢將會致使和雙手指觸摸事件衝突。 這種用僞觸摸方式支持獨立多點觸摸的設備的例子,其中一個就是可移動光標的觸摸板,它同時也支持兩個以上手指的操做。

android.hardware.faketouch.multitouch.jazzhand 應用程序在僞觸摸屏上對五個以上的手指進行獨立的跟蹤。 這是 faketouch 的子特性。

一經聲明,即表示應用程序兼容那些僅能獨立跟蹤五個以上手指操做事件的仿真觸摸設備。

與 android.hardware.touchscreen.multitouch.jazzhand 定義的獨立多點觸摸方式不一樣, 以僞觸摸方式實現的 jazzhand 多點觸摸輸入設備將不支持所有的五手指手勢,由於這種輸入方式將會轉換成屏幕的光標移動。 也就是說,在這種設備上,單個手指的手勢將會移動光標,多手指的手勢將觸發單手指的觸摸事件,其餘的多手指手勢將會致使和多手指觸摸事件的衝突。 這種用僞觸摸方式支持獨立多點觸摸的設備的例子,其中一個就是可移動光標的觸摸板,它同時也支持五個以上手指的操做。

android.hardware.touchscreen 應用程序用到比基本觸摸事件更加複雜的手勢觸摸功能,好比滑動。 這是基本 faketouch 特性的超集。

默認狀況下,應用程序是必須使用本特性的。 這樣,應用程序默認就適用於那些僅能仿真觸摸接口(fake touch)的設備。 若是應用程序須要可以適用於提供仿真觸摸接口的設備(甚至是僅提供方向鍵的設備),則必須用帶有 android:required="false" 的 android.hardware.touchscreen 將觸摸屏顯式聲明爲非必需的。 即使應用程序是用到了但不是必需真正的觸摸屏接口,也應該進行這種聲明。

若是應用程序確實須要觸摸屏接口(爲了處理滑動之類的觸摸手勢),就沒必要進行任何聲明,由於默認這就是必需的。 不過,最好仍是對全部要用到的特性都進行顯式聲明,所以必要的話仍是應該聲明本特性。

若是須要用到更復雜的觸摸操做,好比多個手指的手勢,則應該聲明後續的更爲高級的觸摸屏特性。

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 服務。

本特性隱含聲明瞭父特性android.software.sip,除非附帶了 android:required="false" 聲明。

隱含了特性需求的權限

上述表格中的某些特性常量只適用於對應版本 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
 
分類:  Android
相關文章
相關標籤/搜索