當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Android USB Host與HID 通訊(二)
我們接著上一部分的內(nèi)容繼續(xù)朝下看,上次我們只是簡(jiǎn)單地介紹了一下Android當(dāng)中USB Host編程的一些基礎(chǔ)知識(shí),了解了幾個(gè)常用的類,其實(shí)在Android系統(tǒng)中要想通過(guò)USB Host與HID通訊,所做的工作的還有很多。
先看看AndroidManifest.xml文件,對(duì)于剛接觸好從簡(jiǎn)單入手,在AndroidManifest.xml中加上intent-filter過(guò)濾器,可以先不做請(qǐng)求權(quán)限的處理,因?yàn)閕ntent-filter方式可以自動(dòng)請(qǐng)求權(quán)限。
1) 添加USB HOST權(quán)限
2)添加意圖過(guò)濾器,并配置自己的資源文件指定USB設(shè)備的屬性,而資源文件為一個(gè)xml文件,如:device_filter.xml
3)對(duì)于資源文件device_filter.xml,需要配置設(shè)備的product-id 和vendor-id
剩下的就是java代碼,大概步驟包括:枚舉設(shè)備->找到設(shè)備的接口->連接設(shè)備->分配相應(yīng)的端點(diǎn)->在IN端點(diǎn)進(jìn)行讀操作,在OUT端點(diǎn)進(jìn)行寫操作。在此可以不做請(qǐng)求權(quán)限處理,因?yàn)橐鈭D過(guò)濾器已經(jīng)幫我們做了,若要進(jìn)行動(dòng)態(tài)請(qǐng)求權(quán)限的可以在此基礎(chǔ)上再做擴(kuò)展。
1)獲取USB管理器,若獲取失敗,return。
mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); if(mUsbManager == null) {
return;
}
2)枚舉Host上所有的HID設(shè)備,存入一個(gè)列表,若列表不為空,枚舉到設(shè)備,可以用getVendorId()和getProductId()方法獲取到設(shè)備的VendorId和ProductId,可繼續(xù)找設(shè)備的UsbInterface;若列表為空,未枚舉到設(shè)備。
HashMap deviceList = mUsbManager.getDeviceList();
if (!deviceList.isEmpty()) {
for (UsbDevice device : deviceList.values()) {
if(device.getVendorId() == VendorID && device.getProductId()==ProductID) {
mUsbDevice = device;
// 找到Device接口并分配相應(yīng)端點(diǎn)
findIntfAndEpt();
} else {
oast.makeText(context, "Not find VID and PID",Toast.LENGTH_SHORT).show();
}
}
} else {
new AlertDialog.Builder(context).setTitle("未枚舉到設(shè)備!")
.setMessage("請(qǐng)先連接設(shè)備,再重啟程序。。")
.setCancelable(false)
.setNeutralButton("確定", new DialogInterface.OnClickListener() {
public voidonClick(DialogInterface dialog, int which) {
//finish();
}
}).show();
}
到此為止,就可以發(fā)現(xiàn)你的HID外設(shè),后面的我們下次再說(shuō),主要流程還是:枚舉設(shè)備->找到設(shè)備的接口->連接設(shè)備->分配相應(yīng)的端點(diǎn)->在IN端點(diǎn)進(jìn)行讀操作,在OUT端點(diǎn)進(jìn)行寫操作。