在IOT領域中,如果要與外接裝置(如i2c轉接卡或ComPort等介面)通訊的話,通常會用到USB孔(例如USB OTG),那要使用這些裝置之前,我們要先取得裝置的權限(USB PERMISSION),才能進行後續的開發。
這邊以連接i2c的USB轉接板(FT232H)為例,有使用到com.github.3cky:usb-i2c-android
這個套件庫 GitHub
首先掃描USB裝置,並選定我們的目標USB裝置。
//最外層變數 var i2cAdapter: UsbI2cAdapter? = null var i2cDevice: UsbI2cDevice? = null ... ... //取得連接的usb裝置清單 val usbManager = getSystemService(Context.USB_SERVICE) as UsbManager //尋找支援的I2C裝置清單 val usbI2cManager = UsbI2cManager.create(usbManager).build() val i2cAdapters = usbI2cManager.adapters if (i2cAdapters.isEmpty()) { //如果找不到任何I2C裝置 }else{ //有找到I2C裝置 //列出 for(i in 0 until i2cAdapters.size){ XLog.d(i2cAdapters[i].name + "," + i2cAdapters[i].id) } //選取目標usb裝置 i2cAdapter = i2cAdapters[0] ... ... }
當決定好USB裝置後,就對他檢查是否有權限使用,如果沒有,就要求權限;如果有,就可以進行標準的連線動作。
//檢查權限 if(usbManager.hasPermission(i2cAdapter!!.usbDevice)){ //有權限,進行正常連線 initI2c() }else{//取得權限 //註冊廣播 val filter = IntentFilter("com.android.example.USB_PERMISSION") registerReceiver(mUsbPermissionActionReceiver, filter); //開始要求權限 val mPendingIntent = PendingIntent.getBroadcast(this, 0, Intent("com.android.example.USB_PERMISSION"), 0) usbManager.requestPermission(i2cAdapter!!.getUsbDevice(), mPendingIntent) }
這邊建議將USB連線的部分寫出來一個fun方便取得權限完成後直接連線initI2c()
根據上方程式碼,執行requestPermission
後畫面上會跳出是否允許使用的視窗,這時我們要接收此廣播來進行後續動作。
//取得到USB權限的廣播 private val mUsbPermissionActionReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action if ("com.android.example.USB_PERMISSION".equals(action)) { synchronized(this) { val usbDevice = intent.getParcelableExtra<Parcelable>(UsbManager.EXTRA_DEVICE) as UsbDevice? if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { //user choose YES for your previously popup window asking for grant perssion for this usb device //權限取得成功,進行USB連線 usbDevice?.let { initI2c() } } else { //user choose NO for your previously popup window asking for grant perssion for this usb device //取得失敗,可以進行失敗後的動作 Toast.makeText( context, "Permission denied for device$usbDevice", Toast.LENGTH_LONG ).show() } } } } }
到這邊為止就是一輪取得USB權限的流程了!
-END-
發佈留言