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博客


目录
相关文章
|
4月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
97 0
|
4月前
|
Android开发
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。
65 0
基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离
|
4月前
|
Android开发 C语言
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
这篇文章是关于如何在基于Amlogic T972的Android 9.0系统上,通过自动分配设备号和自动创建设备节点文件的方式,开发字符设备驱动程序的教程。
64 0
基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
|
4月前
|
自然语言处理 Shell Linux
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
本文是关于在Amlogic安卓9.0平台上创建字符设备驱动的教程,详细介绍了驱动程序的编写、编译、部署和测试过程,并提供了完整的源码和应用层调用示例。
93 0
基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
|
4月前
|
传感器 Android开发 芯片
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
本文是系列文章的第三篇,展示了如何在Android系统中利用现有的i2c bus驱动,通过编写设备树节点和应用层的控制代码,实现对基于i2c bus的Slaver设备(如六轴陀螺仪模块QMI8658C)的控制,而无需编写设备驱动代码。
52 0
不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动
|
4月前
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
49 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
4月前
|
Linux Android开发 C语言
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
本文通过实践操作,展示了在Android系统中不编写任何代码,利用设备树(DTS)配置和内核支持的通用GPIO LED驱动来控制LED设备,并进一步通过C语言编写NDK测试APP来实现LED的闪烁效果。
166 0
不写一行代码(一):实现安卓基于GPIO的LED设备驱动
|
9天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
14天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
16天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。