一、列出所有的usb device设备,打印vip pid

private boolean AllDeviceConnected(){UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);HashMap<String, UsbDevice> usbList = manager.getDeviceList();for(String key: usbList.keySet()){UsbDevice usbDevice = usbList.get(key);if(usbDevice != null){Log.d(TAG, "usb device: " + usbDevice.getProductId() + ": " + usbDevice.getVendorId());}}return false;
}

二、使用BroadcastReceiver 系统广播监听usb设备拔插动作,实际测试android.hardware.usb.action.USB_STATE之侦听otg usb口的,而且不管是接这usb线还是不接usb线,进入app的时候,都会有一次广播。UsbManager.ACTION_USB_ACCESSORY_ATTACHED和UsbManager.ACTION_USB_ACCESSORY_DETACHED是U盘插入和拔出的广播,进入app的时候不管接U盘还是不接U盘,都没有广播,进入app后插拔U盘才有广播。

private void detectUsbWithBroadcast() {Log.d(TAG, "listenUsb: register");IntentFilter filter = new IntentFilter();filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);filter.addAction("android.hardware.usb.action.USB_STATE");registerReceiver(mUsbStateChangeReceiver, filter);Log.d(TAG, "listenUsb: registered");}private BroadcastReceiver mUsbStateChangeReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, "onReceive: " + intent.getAction());}};

三、直接贴出测试代码MainActivity.java,MainActivity.java不要有任何的修改,USBBroadcastReceiver\app\src\main\java\com\example\usblistener\MainActivity.java

package com.example.usblistener;import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class MainActivity extends AppCompatActivity {private static final String TAG = "USBDEVICE";private USBBroadcastReceiver usbBroadcastReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);intentFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);intentFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);intentFilter.addAction("android.hardware.usb.action.USB_STATE");usbBroadcastReceiver = new USBBroadcastReceiver();registerReceiver(usbBroadcastReceiver, intentFilter);detectUsbDeviceWithUsbManager();AllDeviceConnected();}@Overrideprotected void onDestroy() {super.onDestroy();if (usbBroadcastReceiver != null) {unregisterReceiver(usbBroadcastReceiver);}}class USBBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubAllDeviceConnected();if (intent.getAction().equals("android.hardware.usb.action.USB_DEVICE_ATTACHED")  ||  intent.getAction().equals("android.hardware.usb.action.USB_DEVICE_DETACHED")) {UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device");Toast.makeText(MainActivity.this, "usb device status changed  action="+intent.getAction()+" pid="+usbDevice.getProductId()+" vid="+usbDevice.getVendorId(), Toast.LENGTH_SHORT).show();}if (intent.getAction().equals("android.hardware.usb.action.USB_STATE")) {if (intent.getExtras().getBoolean("connected")) {// usb 插入Toast.makeText(MainActivity.this, "usb insert", Toast.LENGTH_SHORT).show();Log.i(TAG,"usb insert");} else {//   usb 拔出Toast.makeText(MainActivity.this, "usb pull out", Toast.LENGTH_SHORT).show();Log.i(TAG,"usb  pull out");}}}}private void detectUsbDeviceWithUsbManager() {HashMap<String, UsbDevice> deviceHashMap = ((UsbManager) getSystemService(USB_SERVICE)).getDeviceList();for (Map.Entry entry : deviceHashMap.entrySet()) {Log.d(TAG, "detectUsbDeviceWithUsbManager: " + entry.getKey() + ", " + entry.getValue());}}private boolean isCurrentDeviceConnected(){UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);HashMap<String, UsbDevice> usbList = manager.getDeviceList();for(String key: usbList.keySet()){UsbDevice usbDevice = usbList.get(key);if(usbDevice != null && usbDevice.getProductId() == 10304 && usbDevice.getVendorId() == 1060){return true;}}return false;}private boolean AllDeviceConnected(){UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);HashMap<String, UsbDevice> usbList = manager.getDeviceList();for(String key: usbList.keySet()){UsbDevice usbDevice = usbList.get(key);if(usbDevice != null){Log.d(TAG, "usb device: " + usbDevice.getProductId() + ": " + usbDevice.getVendorId());}}return false;}
}

四、拔插U盘时候的log,测试ok。

 五、在sdk frameworks中也会用到usb功能

frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

六、参考文章

https://www.pianshen.com/article/73781409679/

https://my.oschina.net/u/4352543/blog/3551136

https://www.pianshen.com/article/9533757691/

Android APP 检测和监听当前USB设备插入拔出以及读取VID/PID相关推荐

  1. Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到...

    ---------------------------!! 转载请注明出处 !!----------------------- 一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能正常 ...

  2. Android 监听USB设备插拔事件

    通过注册广播的方式监听USB设备 . 广播Action UsbManager.ACTION_USB_DEVICE_ATTACHED Usb设备插入或者挂载事件通知 UsbManager.ACTION_ ...

  3. iphone检测耳机插入/拔出

    iphone检测耳机插入/拔出 开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iT ...

  4. [iOS] iphone检测耳机插入/拔出

    开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iTouch和iPad等本身不带麦克 ...

  5. 安卓监听手机USB接口拔插警报广播

    安卓监听手机USB接口拔插警报广播 很多场景我们都是需要监听手机拔插,手机都会自带一个广播去监听,我们手机充电,手机接入电脑的时候,一般都会有个小小的震动.在商场上,人多混杂,手机插在USB上,一旦有 ...

  6. Android通过使用系统广播监听网络状态的改变

    Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...

  7. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599 很荣 ...

  8. Android学习按键事件监听与Command模式

    Android学习按键事件监听与Command模式 - Dufresne - 博客园 Android学习按键事件监听与Command模式 一 Command模式 意图: 将一个请求封装为一个对象,从而 ...

  9. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

最新文章

  1. 分子偶极矩大小如何判断_润滑油粘度大小该如何判断你知道吗?
  2. hive的条件查询语句_[一起学Hive]之九-Hive的查询语句SELECT
  3. C#之windows桌面软件第十三课:C#中常用的类有哪些?构造函数怎么用?
  4. 定义分销渠道(distribution channel)
  5. iOS开发(7)通过uiimageView浅谈UIView
  6. 两表左连接count某一字段_表连接解决多日留存率问题|SQL
  7. mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题
  8. IP地址、子网掩码、网关、默认网关、DNS的理解
  9. 【新年假期宅家系列】动漫游戏集中营
  10. 常用正则表达式锦集与Python中正则表达式的用法
  11. no cortex-m sw device found_SW大模块水箱桂林厂家图纸
  12. Android Studio实现记事本项目
  13. jrtplib linux编译,linux下编译jrtplib、jthreadlib
  14. 阿里再“牵手”中国邮政 民营快递或共享资源?
  15. 第23个520情人节,女程序猿送男朋友什么?
  16. 动态图snapshot构建
  17. 基于OpenLayers的地图应用中图标汉化
  18. c# 贪婪匹配 html,C#正则表达式之贪婪模式
  19. .net 基于wkhtmltopdf插件,Rotativa包在后端根据html代码生成pdf文件
  20. 物流中的独立节点路由试算

热门文章

  1. 建立oracle数据库链接,Oracle数据库创建数据库连接(DBLink)详细讲解
  2. cpu要和gpu搭配吗_高端显卡一定要配高档CPU吗?
  3. Android系统之Mtk开机logo镜像单独制作(不用全编译代码)
  4. 原生JS 实现网易云音乐
  5. win32 010 使用masm32
  6. 苹果cms的php.ini,苹果cms伪静态设置教程
  7. 纳米孔Nanopore-16S数据分析学习笔记
  8. 【archlinux】安装系统
  9. webp文件上传格式转换前端解决方案及php端解决方案
  10. ear的英语怎么念_鸡娃英语的你,需要翻越三座大山