猛禽洛的程式筆記庫

[Android] 取得USB裝置的權限

在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-

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *