Android APP 检测和监听当前USB设备插入拔出以及读取VID/PID
一、列出所有的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相关推荐
- Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到...
---------------------------!! 转载请注明出处 !!----------------------- 一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能正常 ...
- Android 监听USB设备插拔事件
通过注册广播的方式监听USB设备 . 广播Action UsbManager.ACTION_USB_DEVICE_ATTACHED Usb设备插入或者挂载事件通知 UsbManager.ACTION_ ...
- iphone检测耳机插入/拔出
iphone检测耳机插入/拔出 开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iT ...
- [iOS] iphone检测耳机插入/拔出
开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iTouch和iPad等本身不带麦克 ...
- 安卓监听手机USB接口拔插警报广播
安卓监听手机USB接口拔插警报广播 很多场景我们都是需要监听手机拔插,手机都会自带一个广播去监听,我们手机充电,手机接入电脑的时候,一般都会有个小小的震动.在商场上,人多混杂,手机插在USB上,一旦有 ...
- Android通过使用系统广播监听网络状态的改变
Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599 很荣 ...
- Android学习按键事件监听与Command模式
Android学习按键事件监听与Command模式 - Dufresne - 博客园 Android学习按键事件监听与Command模式 一 Command模式 意图: 将一个请求封装为一个对象,从而 ...
- android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件
Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...
最新文章
- 分子偶极矩大小如何判断_润滑油粘度大小该如何判断你知道吗?
- hive的条件查询语句_[一起学Hive]之九-Hive的查询语句SELECT
- C#之windows桌面软件第十三课:C#中常用的类有哪些?构造函数怎么用?
- 定义分销渠道(distribution channel)
- iOS开发(7)通过uiimageView浅谈UIView
- 两表左连接count某一字段_表连接解决多日留存率问题|SQL
- mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题
- IP地址、子网掩码、网关、默认网关、DNS的理解
- 【新年假期宅家系列】动漫游戏集中营
- 常用正则表达式锦集与Python中正则表达式的用法
- no cortex-m sw device found_SW大模块水箱桂林厂家图纸
- Android Studio实现记事本项目
- jrtplib linux编译,linux下编译jrtplib、jthreadlib
- 阿里再“牵手”中国邮政 民营快递或共享资源?
- 第23个520情人节,女程序猿送男朋友什么?
- 动态图snapshot构建
- 基于OpenLayers的地图应用中图标汉化
- c# 贪婪匹配 html,C#正则表达式之贪婪模式
- .net 基于wkhtmltopdf插件,Rotativa包在后端根据html代码生成pdf文件
- 物流中的独立节点路由试算
热门文章
- 建立oracle数据库链接,Oracle数据库创建数据库连接(DBLink)详细讲解
- cpu要和gpu搭配吗_高端显卡一定要配高档CPU吗?
- Android系统之Mtk开机logo镜像单独制作(不用全编译代码)
- 原生JS 实现网易云音乐
- win32 010 使用masm32
- 苹果cms的php.ini,苹果cms伪静态设置教程
- 纳米孔Nanopore-16S数据分析学习笔记
- 【archlinux】安装系统
- webp文件上传格式转换前端解决方案及php端解决方案
- ear的英语怎么念_鸡娃英语的你,需要翻越三座大山