监听Android usb的事件

博客介绍了在Android中监听USB设备指令的方法。通过adb shell进入执行cat /proc/bus/input/devices查看所有USB设备,了解外接输入设备信息含义,监听Handlers对应的事件,如event0,输入getevent /dev/input/event0进行监听,还提及在Android中读取传入值的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候手机可能会连接到usb ,需要去监听usb是否有指令传出

 adb shell 进入执行  cat  /proc/bus/input/devices   

查看所有usb设备  

USB外接输入设备信息含义如下:

I: Bus=0019 Vendor=0002 Product=0001 Version=0100 //在Android设备与USB设备数据交互的是否使用到。

N: Name="vmouse"  //外接的USB设备的名称。

H: Handlers=mouse event0 //输入设备监听事件

P: Phys=vmouse/input0

S: Sysfs=/devices/virtual/input/input0

这两行可用于识别该USB设备连接在Android设备的哪一个USB口.
 

通过上面的查询 ,我们 就能查询到具体的设备   上面图片

Handlers=mouse event0 / //输入设备监听事件

我们监听event0  就行

输入指令getevent  /dev/input/event0  进行监听

//通过上面的方法后就可以  查看到 具体要查看的usb接口了  那么在android中怎么去读取传入的值呢

public class MyThread implements Runnable {
    int count = 1, number;
    UsbManager mUsbManager;

    public MyThread(int num, UsbManager usbManager) {
        number = num;
        System.out.println("创建线程" + number);
        mUsbManager = usbManager;
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void run() {
        while (true) {
            System.out.println("线程" + number + ":计数" + count);
            HashMap<String, UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
            Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();

            System.out.println("deviceHashMap.isEmpty()" + deviceHashMap.isEmpty());

            while (iterator.hasNext()) {
                UsbDevice usbDevice = iterator.next();
                UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点
                UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);  //读数据节点
                UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
                connection.claimInterface(usbInterface, true);
                String name = usbDevice.getProductName();
                if (name .equals("USB2.0 Camera") ) {
                    System.out.println("ret" + name);

                }
                //发送数据
                byte[] byte2 = new byte[1024];

                //读取数据1   两种方法读取数据
                int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);
                System.out.println("ret");
//                Log.i("ret", "ret:" + ret);
//                Log.i("ret", "bat is ok  length:" + byte2.length);
                StringBuilder stringBuilder = new StringBuilder();
                for (Byte byte1 : byte2) {
                    stringBuilder.append(byte1 + "");
                }
                if (name .equals("USB2.0 Camera") ) {
                    Log.i("ret", "byte1 :" + stringBuilder.toString());
                }

            }
        }
    }
}
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); 
        new Thread(new MyThread(1,usbManager)).start(); //启动线程

    }

亲测 可行

===========================================================================================


 

 

 

<think>我们参考了多个站内引用,其中引用[1][2][4]都提到了通过广播接收器(BroadcastReceiver)来监听USB设备的插拔事件。具体步骤如下:1.**注册广播接收器**:可以在AndroidManifest.xml中静态注册,也可以在代码中动态注册。2.**监听特定的Action**:需要监听的两个主要Action是:-`UsbManager.ACTION_USB_DEVICE_ATTACHED`(USB设备插入)-`UsbManager.ACTION_USB_DEVICE_DETACHED`(USB设备拔出)3.**在广播接收器中处理事件**:在`onReceive`方法中,根据接收到的Action执行相应的操作,例如获取插入的USB设备信息。引用[1]和[4]展示了在AndroidManifest.xml中静态注册的示例,而引用[2]展示了动态注册的示例。此外,引用[3]提到了监听U盘插入(使用`Intent.ACTION_MEDIA_MOUNTED`),这通常用于存储设备(如U盘)的挂载事件,而非普通的USB设备(如输入设备)。因此,对于普通的USB设备(如键盘、鼠标等),我们应该使用`UsbManager`中定义的Action。引用[5]则提到了对外接键盘事件监听,但它是通过修改系统源码实现的,这对于普通应用开发来说并不适用。我们通常使用广播接收器。根据上述分析,实现USB设备插入监听的方法如下:###方法一:静态注册广播接收器(在AndroidManifest.xml中声明)```xml<receiverandroid:name=".USBReceiver"><intent-filter><actionandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/><actionandroid:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/></intent-filter></receiver>```然后在代码中定义广播接收器:```javapublicclassUSBReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)){//获取插入的USB设备UsbDevicedevice=intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);Log.i("USB","USB设备连接:"+device.getDeviceName());//这里可以获取设备的信息,如vendorId,productId等}elseif(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){UsbDevicedevice=intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);Log.i("USB","USB设备断开:"+device.getDeviceName());}}}```###方法二:动态注册广播接收器(在Activity或Service中)```java//在Activity或Service中privateBroadcastReceiverusbReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)){UsbDevicedevice=intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);//处理插入事件}elseif(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){UsbDevicedevice=intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);//处理拔出事件}}};//注册广播@OverrideprotectedvoidonResume(){super.onResume();IntentFilterfilter=newIntentFilter();filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);registerReceiver(usbReceiver,filter);}//注销广播@OverrideprotectedvoidonPause(){super.onPause();unregisterReceiver(usbReceiver);}```###注意事项:1.静态注册需要应用在清单文件中声明,并且设备插入时如果应用未运行,系统会自动启动应用。但需要注意,有些系统可能对静态注册有限制。2.动态注册的生命周期与注册的组件(如Activity)绑定,需要在组件销毁时注销,否则会导致内存泄漏。3.从Android8.0(API26)开始,对静态注册广播接收器增加了限制,对于大部分系统广播(如USB事件)仍然可以静态注册,但建议使用动态注册以确保可靠性[^1][^2][^4]。此外,如果您的应用需要与USB设备进行通信(不仅仅监听插拔),则可能需要获取USB设备的权限,这可以通过`UsbManager`来申请。以上两种方法都可以实现USB设备的插拔监听,开发者可以根据具体需求选择静态注册或动态注册。§§相关问题§§1.Android中如何区分不同类型的USB设备(如键盘、存储设备)?2.如何获取已连接的USB设备列表?3.在监听USB设备插入事件后,如何与USB设备进行通信?</think> ### 在Android监听USB插入事件的方法 在Android系统中监听USB设备的插入事件,主要有两种实现方式: --- #### 方法一:通过广播接收器(BroadcastReceiver)实现 这是最常用的标准方法,需要注册USB设备插拔的广播监听: ```java // 1. 创建广播接收器 private final BroadcastReceiver usbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // 获取USB设备对象 UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); Log.d("USB", "设备插入: " + device.getDeviceName()); // 获取设备ID等信息 int vendorId = device.getVendorId(); int productId = device.getProductId(); } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 处理拔出事件 } } }; // 2. 在Activity中注册广播 @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(usbReceiver, filter); } // 3. 反注册(避免内存泄漏) @Override protected void onPause() { super.onPause(); unregisterReceiver(usbReceiver); } ``` --- #### 方法二:通过清单文件静态注册 在AndroidManifest.xml中声明广播接收器: ```xml <receiver android:name=".UsbEventReceiver"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/> <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/> </intent-filter> </receiver> ``` 接收器实现类: ```java public class UsbEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); // 处理插拔事件 } } ``` --- ### 注意事项: 1. **设备识别**:通过`UsbDevice`对象可获取设备信息: ```java device.getVendorId(); // 厂商ID device.getProductId(); // 产品ID device.getDeviceName(); // 设备名 ``` 2. **存储设备监听**:对于U盘等存储设备,需添加额外监听: ```java filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addDataScheme("file"); // 关键声明 ``` 3. **权限问题**:部分设备需授权才能访问,可通过`UsbManager`申请权限[^5] 4. **系统版本**:Android 8.0+对静态广播注册有限制,建议动态注册 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值