Android监听USB设备插拔

简介: Android监听USB设备插拔

Android监听USB设备插拔


正常来说,每次插拔USB设备的时候,系统都会发出广播,所以只需监听对应的广播即可。但是有一小部分设备可能和系统存在兼容问题,导致系统无法发出广播,所以不能准确监听插拔,只能通过其他方式来判断。

一、监听系统广播

1.1注册广播

InputManager manager = (InputManager) getSystemService(Context.INPUT_SERVICE);

manager.registerInputDeviceListener(new InputListener() , null);

public void registerReceiver() {
    IntentFilter filter = new IntentFilter();
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
    mUsbReceiver = new USBReceiver();
    mContext.registerReceiver(mUsbReceiver, filter);
}

1.2广播接收类

private class USBReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 这里可以拿到插入的USB设备对象
        UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        switch (intent.getAction()) {
            case UsbManager.ACTION_USB_DEVICE_ATTACHED: // 插入USB设备
                break;
            case UsbManager.ACTION_USB_DEVICE_DETACHED: // 拔出USB设备
                break;
            default:
                break;
        }
    }
}

输入型USB设备

输入型设备,包括扫码枪、键盘、鼠标等。使用普通的USB插拔广播,无法监听到此类设备的插拔。

需使用InputManager.InputDeviceListener进行监听。

public class InputListener implements InputManager.InputDeviceListener {
  @Override public void onInputDeviceAdded(int id) {
      // Called whenever an input device has been added to the system.
     Log.d(TAG, "onInputDeviceAdded");
  }
  @Override public void onInputDeviceRemoved(int id) {
      // Called whenever an input device has been removed from the system.
    Log.d(TAG, "onInputDeviceRemoved");
  }
  @Override public void onInputDeviceChanged(int id) {
      // Called whenever the properties of an input device have changed since they were last queried.
    Log.d(TAG, "onInputDeviceChanged");
  }
}

1.3注销广播

manager.unregisterInputDeviceListener(this);
public void unregisterReceiver() {
    mContext.unregisterReceiver(mUsbReceiver);
}

二、通过轮询获取USB设备列表的方式判断

之前开发过一款外接USB相机,发现其和Android5.1.1系统不兼容,每次插拔的时候系统并不会发出广播,其他系统版本又正常,无奈app是针对5.1.1系统定制开发的,又必须及时响应USB插拔,所以只能通过其他方式来判断。

2.1获取USB设备列表

UsbManager mUsbManager = (UsbManager) context.getSystemService(context.USB_SERVICE);

HashMap<String, UsbDevice> mDeviceMap = mUsbManager.getDeviceList();

2.2遍历获取到的USB设备列表,判断其中是否有你需要的设备

比如我想过滤的设备是USB相机,可以根据设备的大小类进行判断。

public UsbDevice getUsbCameraDevice() {
    if (mDeviceMap!= null) {
        for (UsbDevice usbDevice : mDeviceMap.values()) {
            if (isUsbCamera(usbDevice)) {
                return usbDevice;
            }
        }
    }
    return null;
}
public boolean isUsbCamera(UsbDevice usbDevice) {
    return usbDevice != null && 239 == usbDevice.getDeviceClass() && 2 == usbDevice.getDeviceSubclass();
}

2.3轮询

进入某个页面时开始轮询,如5秒轮询一次,当getUsbCameraDevice不为空时判断插入了USB相机,就可以处理打开相机的逻辑,为空时则判断USB相机拔出,关闭相机。当然这并不是一个完美的方法,只是一个无奈之举,对于不存在兼容问题的设备还是通过监听系统广播的方式来处理更好。

// 这里使用rxjava来轮询
Observable.interval(1, 5, TimeUnit.SECONDS)
        .compose(RxUtil.<Long>io_main())
        .subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                if (getUsbCameraDevice() != null) { // 插入了USB设备
                    
                } else { // USB设备已拔出
                }
            }
        });

(348条消息) Android如何监听USB插拔_android 检测usb是否插入_lghv5的博客-CSDN博客

(348条消息) Android USB设备插拔监听_android usbreceiver_m筱米的博客-CSDN博客


目录
相关文章
|
5月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
251 64
|
5月前
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
312 64
|
5月前
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
849 62
|
5月前
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
279 61
|
6月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
256 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
221 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
116 11
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
140 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1114 77