电子秤和读卡器都可以通过usb口和pos通信。
设备插拔,系统广播
插入或者拔出usb设备时,Android系统都会发出广播,我们可以通过广播监听者BrocastReceiver监听相应的广播,进行相应的初始化或者资源释放。共有三种广播:
-
设备插入广播
-
设备授权广播
-
设备播出广播
public class UsbDeviceHelper extends BroadcastReceiver {
//android标准的广播action
private static final String ACTION_USB_DEVICE_PERMISSION = "com.android.example.USB_PERMISSION";
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null) return;
String action = intent.getAction();
if (TextUtils.isEmpty(action)) return;
if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)){
//设备插入,获取这个插入的UsbDevice
usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
//向用户获取连接USB设备的授权
requestUserPermission();
}else if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)){
//设备拔下,资源释放
}else if (action.equals(ACTION_USB_DEVICE_PERMISSION)){
//获取连接设备的权限
boolean isGranted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false);
if (isGranted){
//用户已授权
}else {
//用户未授权
}
}
}
/**
* 检测到设备插入之后,向用户请求连接设备的权限
*/
private void requestUserPermission(UsbDevice usbDevice) {
if (usbManager.hasPermission(usbDevice)){
//已经有权限的话,直接初始化驱动
//判断已经授予权限
return;
}
//发一个延时广播
PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0,
new Intent(ACTION_USB_DEVICE_PERMISSION), 0);
//这一句会由系统弹出对话框,向用户获取连接授权
usbManager.requestPermission(usbDevice, mPendingIntent);
}
/**
* 注册USB设备插拔事件监听
*/
public void registerUsbEventReceiver(Context context){
this.context = context.getApplicationContext();
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_USB_DEVICE_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
this.context.registerReceiver(this, filter);
}
}
整体流程如上面流程图:
-
设备插入,Android系统检测到后会发出一个广播。android系统检测到设备的插入,可能会花费1秒左右的时间;
-
BrocastReceiver监听到设备插入的广播,向用户获取连接设备的权限,弹出对话框,让用户选择是否连接。这样做是为了系统安全性,防止恶意的USB设备连接Android设备;
-
用户授权完毕后,也会发出广播,授权结果可以通过Intent对象获取;
-
用户授权允许连接,进行初始化,连接设备;
-
用户未授权,不允许连接,提示用户。
-
设备拔出,Android系统也可以检测到并发出一个广播,BrocastReceiver接收到广播后,进行资源释放,结束。
至于BrocastReceiver,可以在用户登录成功后再进行注册,在应用退出时进行反注册。