检测USB设备何时从Android设备分离

时间:2015-01-30 12:31:32

标签: android usb

我正在使用usb POS打印机和我的应用程序。我已经成功编写了连接,请求权限和打印数据的代码。但是,我不确定在打印机断开连接时如何通知用户,如果是,则设备将退回到网络打印机。

所以这是我的BroadcastReceiver请求权限:

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                        mDevice = device;

                        if(mConnection == null){
                            Log.i(m_Tag, "Connection is null");
                        }
                        Log.i(m_Tag, "Connected successfully");
                    }else{
                        Log.i(m_Tag, "Device is null");
                    }
                }
                else {
                }
            }
        }
    }
};

我在这里搜索了论坛并提出了答案,并且我已经检查了这个http://developer.android.com/guide/topics/connectivity/usb/host.html我找不到一个可靠的方法来做到这一点,而不包括设备过滤器xml文件。我无法做到这一点,因为我不确定最终用户将使用哪种型号的打印机。

我的大脑就是这样炒的,如果有人可以指出如何做到这一点,我会非常感激。

1 个答案:

答案 0 :(得分:0)

很晚,但对于未来的读者来说,我是如何做到这一点的。

onStart()中,我为ACTION_USB_DEVICE_DETACHED动作注册广播接收器。

@Override
protected void onStart() {
        Log.d(TAG, "onStart()");
        super.onStart();

        // Catch a USB detach broadcast intent.
        detachReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
                    jobsDone();
                }
            }
        };

        // Set the intent filter for the broadcast receiver, and register.
        IntentFilter filter = new IntentFilter();
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(detachReceiver, filter);
}

在我的jobsDone()中,我刚刚完成了与按“后退”基本相同的活动。

private void jobsDone() {
    Log.d(TAG, "jobsDone()");
    this.finish();
}

因为在我的情况下,一次只能连接一个USB设备,所以我不需要为device_filter.xml而烦恼。

还记得取消注册接收器。

@Override
protected void onStop() {
    Log.d(TAG, "onStop()");
    super.onStop();
    // Unregister the BroadcastReceiver
    unregisterReceiver(detachReceiver);
}