應用程式需要對MCE Usb裝置進行操作。首先使用UsbManager的getDeviceList介面擷取USB裝置列表時,引發PackageManager.PERMISSION_DENIED異常。 應用程式的確已經在AndroidManifest.xml中聲明了所需的許可權,所以從Framework層找問題的原因。
首先看out目錄下/system/etc/permissions,發現缺少android.hardware.usb.host.xml。在device.mk中
PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml
為節約時間不重新編譯了,將該檔案push到裝置中,發現異常依舊。查看其他裝置的許可權檔案,發現系統開放的裝置存取權限都被寫在了這個檔案中:system/etc/permissions/handheld_core_hardware.xml。照樣添加:
<feature name="android.hardware.usb.host" />
這次再次開啟應用程式,已經不再報PackageManager.PERMISSION_DENIED的異常,但是usb裝置無法工作。應該是核心原因。開啟核心開關對MCE、LIRC的支援:
CONFIG_LIRC=yCONFIG_IR_LIRC_CODEC=yCONFIG_IR_MCEUSB=yCONFIG_LIRC_STAGING=y
現在裝置已經可以被識別為一個mce裝置了,但是無法匹配獲得usb_device_id。看匹配演算法,發現mce裝置要通過查表擷取。kernel/drivers/media/rc/mceusb.c中mceusb_dev_table的匹配表沒有該裝置的廠商號。添加即可:
static struct usb_device_id mceusb_dev_table[] = { ...... /* Formosa Industrial Computing / Beanbag Emulation Device */ { USB_DEVICE(VENDOR_FORMOSA, 0xe018) }, { USB_DEVICE(VENDOR_FORMOSA, 0xe042) }, /* Formosa21 / eHome Infrared Receiver */ { USB_DEVICE(VENDOR_FORMOSA, 0xe03a) }, /* Formosa Industrial Computing AIM IR605/A */ ... ...}
通過以上作業, mce相關裝置就已經添加好了,可以在apk中操作。