在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-
發佈留言