1. 程式人生 > >android程式中的AndroidManifest.xml中的uses-feature詳解

android程式中的AndroidManifest.xml中的uses-feature詳解

AndroidManifest.xml中的uses-feature

Android的manifest檔案:

用於指定android程式,是否需要某種硬體或軟體資源/功能。

uses-feature的語法

<uses-feature
  android:name="string"
  android:required=["true" | "false"]
  android:glEsVersion="integer" />
 

android:name

  • 攝像頭: android.hardware.camera
  • 各種感測器:
    • 加速計 :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.microphone
  • 定位: android.hardware.location
  • USB:
    • USB Host: android.hardware.usb.host
  • WIFI: android.hardware.wifi
  • 藍芽: android.hardware.bluetooth
  • Bluetooth Low Energy: android.software.bluetooth_le
  • VOIP: android.software.sip.voip

http://developer.android.com/guide/topics/manifest/uses-feature-element.html#features-reference

android:required

  • android:required="true" :表示需要裝置具有某個功能。
    • 如果裝置沒有該功能,則程式不工作,就是可以理解的
  • android:required="false" :表示希望裝置,最好具有某個功能
    • 裝置即使沒有該功能,程式也應該可以正常工作
    • 為了程式工作的更好,最好具有該功能。

如果不指定,預設為true:

android:required="true":

android:qlEsVersion

  • OpenGL ES 1.0
  • OpenGL ES 2.0
  • OpenGL ES 3.0

我這裡不涉及到,不去深究。

uses-feature寫法舉例

1.某程式需要藍芽和攝像頭,就可以這麼寫:

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

2.如果,某個裝置,是類似於照相機之類的程式,那麼沒有攝像頭,就沒法正常工作,則可以加上required引數為true:

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

3.如果某個檔案共享的軟體,除了通過WIFI傳輸外,如果有藍芽,那最好,也支援通過藍芽傳輸,則可以加上required為false,希望最好有藍芽:

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

4.比如,我的程式,是將android裝置作為USB的Host,外接USB的裝置的,所以要求必須有USB的host,所以可以寫為:

<uses-feature android:required="true" android:name="android.hardware.usb.host" />

uses-feature的注意事項和其他說明

uses-feature,只是起到指示性的作用,不是強制的檢測

uses-feature,只是起到指示性的作用,不是強制的檢測

如果像上面的,我寫了:

<uses-feature android:name="android.hardware.usb.host" android:required="true" />

[2013-11-05 10:15:37 - com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper] Parser exception for D:\DevRoot\xxxxxxxxxxxxxx\AndroidManifest.xml: Element type "uses-feature" must be followed by either attribute specifications, ">" or "/>". 

[2013-11-05 10:15:37 - yyyy] Error in an XML file: aborting build.

<uses-feature android:required="true" android:name="android.hardware.usb.host" />

本意是:希望此android裝置必須有usb的host,否則沒法工作。

即使沒有usb的host,該app,也是可以在該android裝置上面跑的

只不過不能正常工作罷了。

而作為Android系統,是不是強制去檢測:

當此android裝置,沒有usb的host,就不讓該app執行。

寫android的app時最好還是加上合適的uses-feature的說明比較好

對於其他一些程式,比如Google Play

會根據你的程式中的uses-feature的宣告,去過濾,分類android的app的。

另外,你的程式中,也最好,根據實際需要,去加上合適的uses-feature的說明,比較好。

方便使用者和其他人明白,你的app對於資源的需求:

至少間接的相當於:給當前app,弄了個prerequisite前提條件了。

便於使用者清楚需要哪些軟硬體條件,才能執行你的當前的app。

可以用aapt去檢測android的app(xxx.apk)中的uses-feature屬性

Testing the features required by your application

adt-bundle-windows/sdk/platform-tools/aapt.exe

去拷貝了某個apk,測試了一把,結果如下:

CLi@PC-CLI-1 /cygdrive/d/DevRoot/android/adt-bundle-windows/sdk/platform-tools
$ ls
aapt.exe*  AdbWinApi.dll*     aidl.exe*  crifanLiTestAapt.apk*    crifanLiTestAapt_3.apk*  dx.bat*        lib/             NOTICE.txt*    source.properties*
adb.exe*   AdbWinUsbApi.dll*  api/       crifanLiTestAapt_2.apk*  dexdump.exe*             fastboot.exe*  llvm-rs-cc.exe*  renderscript/

CLi@PC-CLI-1 /cygdrive/d/DevRoot/android/adt-bundle-windows/sdk/platform-tools
$ ./aapt dump badging crifanLiTestAapt_3.apk
package: name='com.mm.xxxxxxx' versionCode='1' versionName='1.0'
sdkVersion:'14'
targetSdkVersion:'17'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-feature:'android.hardware.usb.host'
application-label:'MobileHandHeld'
application-label-zh:'某android應用程式'
application-icon-160:'res/drawable-mdpi/yyyyyyyyyy.png'
application-icon-240:'res/drawable-hdpi/yyyyyyyyyy.png'
application-icon-320:'res/drawable-xhdpi/yyyyyyyyyy.png'
application-icon-480:'res/drawable-xxhdpi/yyyyyyyyyy.png'
application: label='MobileHandHeld' icon='res/drawable-mdpi/yyyyyyyyyy.png'
launchable-activity: name='com.mm.xxxxxxx.activities.DeviceListActivity'  label='MobileHandHeld' icon=''
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional'
uses-feature:'android.hardware.screen.landscape'
uses-implied-feature:'android.hardware.screen.landscape','one or more activities have specified a landscape orientation'
main
other-activities
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'zh'
densities: '160' '240' '320' '480'


AndroidManifest.xml中的<uses-feature>以及和<uses-permission>之間的聯絡

概述:<uses-feature>用來宣告應用中需要用的硬體和軟體的功能。

硬體特性:表明您的應用需要用的硬體功能。

功能型別 特徵描述 描述
音訊 android.hardware.audio.low_latency 該應用程式使用低延遲的音訊裝置上的管道,聲音輸入或輸出延遲或滯後敏感。
藍芽 android.hardware.bluetooth 該應用程式使用藍芽無線功能,在裝置中。
相機 android.hardware.camera 該應用程式使用該裝置的攝像頭。如果裝置支援多個攝像頭,應用程式使用相機,面對從螢幕上移開。
  android.hardware.camera.autofocus 子功能。該應用程式使用裝置相機的自動對焦能力。
  android.hardware.camera.flash 子功能。該應用程式使用裝置相機的閃光燈。
  android.hardware.camera.front 子功能。該應用程式使用裝置上的前置攝像頭。
  android.hardware.camera.any 該應用程式使用至少一個攝像頭朝向任何方向。使用當前在偏好android.hardware.camera的,如果不需要的背面朝相機。
位置 android.hardware.location 該應用程式使用裝置上的一個或多個特徵,確定位置,如GPS定位,網路位置或細胞的位置。
  android.hardware.location.network 子功能。該應用程式使用從裝置支援的基於網路的地理定位系統獲得的粗略的位置座標
  android.hardware.location.gps 子功能。該應用程式使用裝置上的全球定位系統接收器獲得的精確位置座標。
麥克風 android.hardware.microphone 該應用程式使用裝置上的麥克風。
NFC android.hardware.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.screen.landscape 該應用程式需要橫向。
  android.hardware.screen.portrait 該應用程式需要縱向。
電話 android.hardware.telephony 該應用程式使用電話功能的移動裝置,例如,電話與資料通訊業務的無線電。
  android.hardware.telephony.cdma 子功能。該應用程式使用CDMA電話收音機功能在裝置上的。
  android.hardware.telephony.gsm 子功能。應用程式在裝置上採用了GSM電話收音機功能。
電視 android.hardware.type.television 應用程式是專為電視使用者體驗。
觸控式螢幕 android.hardware.faketouch 該應用程式使用基本的的觸控互動活動,如“點選”,“點選”,並拖動。
  android.hardware.faketouch.multitouch.distinct 不同的應用程式執行跟蹤的兩個或兩個以上的“手指”上假的觸控介面。這是的faketouch功能的一個超集。
  android.hardware.faketouch.multitouch.jazzhand 不同的應用程式執行的跟蹤5個或以上的“手指”上假的觸控介面。這是的faketouch功能的一個超集。
  android.hardware.touchscreen 該應用程式使用的觸控式螢幕功能,比基本觸控事件,如一扔,更具互動性的手勢。這是的基本faketouch功能的一個超集。
  android.hardware.touchscreen.multitouch 應用程式使用在裝置螢幕上的兩個基本點的多點觸控功能,如捏的手勢,但,不需要獨立跟蹤觸及。這是觸控式螢幕功能的一個超集。
  android.hardware.touchscreen.multitouch.distinct 子功能。在裝置螢幕上的應用程式採用了先進的多點多點觸控功能,如跟蹤兩個或兩個以上的點完全獨立。這是一個多點觸控功能的超集。
  android.hardware.touchscreen.multitouch.jazzhand 在裝置螢幕上的應用程式採用了先進的多點多點觸控功能,跟蹤到五點完全獨立。這是一個獨特的多點觸控功能的超集。
USB android.hardware.usb.host 該應用程式使用USB主機模式功能(表現為主機和USB裝置連線到)。
  android.hardware.usb.accessory 該應用程式使用的USB附件功能(表現為USB裝置連線到USB主機)。
無線上網 android.hardware.wifi 應用程式使用802.11網路(WIFI)功能的裝置上的。
     

軟體功能:表明您的應用程式使用或需要的軟體功能。

特點 屬性值 描述
應用程式! android.software.app_widgets 該應用程式使用或提供應用小工具,僅應安裝的裝置上,包括一個主螢幕或類似的位置,使用者可以應用小工具嵌入。
藍芽低功耗 android.software.bluetooth_le

該應用程式使用藍芽低能量的API只能夠與其他裝置通過藍芽低功耗通訊裝置,應安裝。這也隱含宣告的android.hardware.bluetooth功能。

主螢幕 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"
     

許可權和功能之間的聯絡:

類別 需要的許可權 要求的功能
藍芽 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
無線上網 ACCESS_WIFI_STATE android.hardware.wifi
  CHANGE_WIFI_STATE android.hardware.wifi
  CHANGE_WIFI_MULTICAST_STATE android.hardware.wifi