Android USB摄像头插拔监听

    • 一、简要介绍
    • 二、使用广播监听USB摄像头插拔情况
      • 1、注册监听USB设备插拔广播
      • 2、判断UsbDevice是否是Camera设备 (重点)
    • 二、通过UsbManager来获取当前设备的Usb摄像头信息
    • Camera设备节点
      • 使用设备节点要注意:
  • 共勉:人生没有一条路是白走的。每个不满意的现在,都有个不努力的曾经。一个人至少拥有一个梦想,有一个理由去坚强。

部分Android开发设备可以插入USB摄像头使用,刚好工作用到了,本文将对USBCamera拔插监听进行总结记录。

一、简要介绍

USB摄像头,可以通过广播监听,监听到USB摄像头的插拔情况;
还可以使用UsbManager来获取当前设备存在的外设,从中获取USB摄像头信息。
还可以在底层监听Camera变化,不过这个比较麻烦,本文不做介绍。

使用广播可以动态获取UsbCamera,并作出相应的操作;
使用UsbManager,主要是用在即时性的操作,
比如某个页面准备要用UsbCamera可以提前判断是否已存在UsbCamera设备。

二、使用广播监听USB摄像头插拔情况

1、注册监听USB设备插拔广播

    private BroadcastReceiver mBroadcastReceiver;//注册监听Usb设备插拔广播private void registerBroadcastReceiver() {Log.i(TAG, "registerBroadcastReceiver");if (mBroadcastReceiver == null) {mBroadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent == null) {return;}// 这里可以拿到插入的USB设备对象UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);switch (intent.getAction()) {case UsbManager.ACTION_USB_DEVICE_ATTACHED: // 插入USB设备if (isUsbCameraDevice(usbDevice)) {Toast.makeText(UsbCameraActivity.this, "Usb摄像头已插入", Toast.LENGTH_LONG).show();//do some thing}break;case UsbManager.ACTION_USB_DEVICE_DETACHED: // 拔出USB设备if (isUsbCameraDevice(usbDevice)) {Toast.makeText(UsbCameraActivity.this, "Usb摄像头已拔出", Toast.LENGTH_LONG).show();//do some thing}break;default:break;}}};}IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); //外设插入广播intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); //外设拔出广播registerReceiver(mBroadcastReceiver, intentFilter);}//反注册监听Usb设备插拔广播private void unregisterBroadcastReceiver() {Log.i(TAG, "unregisterBroadcastReceiver");if (mBroadcastReceiver != null) {unregisterReceiver(mBroadcastReceiver);}}

2、判断UsbDevice是否是Camera设备 (重点)

private static final int USB_CAMERA_TYPE = 14; //可能跟不同系统设备相关,一般是某个固定值,可以打Log验证。/*** 判断当前Usb设备是否是Camera设备*/private boolean isUsbCameraDevice(UsbDevice usbDevice) {Log.i(TAG, "isUsbCameraDevice  usbDevice " + usbDevice.getProductName() + usbDevice.getDeviceClass() + ", subclass = " + usbDevice.getDeviceSubclass());if (usbDevice == null) {return false;}boolean isCamera = false;int interfaceCount = usbDevice.getInterfaceCount();for (int interIndex = 0; interIndex < interfaceCount; interIndex++) {UsbInterface usbInterface = usbDevice.getInterface(interIndex);//usbInterface.getName()遇到过为null的情况if ((usbInterface.getName() == null || usbDevice.getProductName().equals(usbInterface.getName())) && usbInterface.getInterfaceClass() == USB_CAMERA_TYPE) {isCamera = true;break;}}Log.i(TAG, "onReceive usbDevice = " + usbDevice.getProductName() + "isCamera = " + isCamera);return isCamera;}

网上是有很多判断UsbDevice是否是Camera设备的逻辑代码,但是好像没有完全正确的。

比如下面这个:

    //不准确的判断public boolean isUsbCamera(UsbDevice usbDevice) {return usbDevice != null && 239 == usbDevice.getDeviceClass() && 2 == usbDevice.getDeviceSubclass();}

很多设备都会符合这个条件,比分mic设备,无线WiFi设备等等。所以使用这个逻辑会有概率的误判断。

通过我的多次研究判断,usbInterface.getInterfaceClass()也是不同设备的类型值,但是这个值在api中未定义。
这个值在MTK848,9950,USB摄像头设备获取到的都是等于14。

二、通过UsbManager来获取当前设备的Usb摄像头信息

    /*** 通过 UsbManager获取当前外设摄像头信息*/private List<UsbDevice> getCameraList() {Log.i(TAG, "getCameraList");List<UsbDevice> cameraList = new ArrayList<>();UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); //这个只适用于Usb设备HashMap<String, UsbDevice> mDeviceMap = mUsbManager.getDeviceList();if (mDeviceMap != null) {for (UsbDevice usbDevice : mDeviceMap.values()) {if (isUsbCameraDevice(usbDevice)) {cameraList.add(usbDevice);}}}return cameraList;}/*** 通过 UsbManager获取当前外设摄像头名称信息*/private List<String> getCameraStringList() {List<String> cameraList = new ArrayList<>();UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);HashMap<String, UsbDevice> mDeviceMap = mUsbManager.getDeviceList();if (mDeviceMap != null) {for (UsbDevice usbDevice : mDeviceMap.values()) {if (isUsbCameraDevice(usbDevice)) {cameraList.add(usbDevice.getProductName());}}}return cameraList;}

同样是通过遍历所有UsbDevice对象来判断是否是Usb摄像头设备。

Camera设备节点

外部设备节点都是在dev下的,相机节点的关键字是video,
比如:/dev/video0 表示第一个插入的摄像头,video1表示插入的第二个摄像头,以此类推。
有系统权限的应用,可以直接读取这个节点的名称,

private void updateDevVideoList() {File file = new File("/dev");if (file.isDirectory()) {File[] list = file.listFiles();if (list != null) {for (File it : list) {if (it.getName().contains("video")){//videoX}}}}}

使用设备节点要注意:

1、节点数据里面,没有设备名称
2、并不是所有外接摄像头都是只有一个设备节点,
部分设备存在两个节点,需要在C++底层对节点进行分析判断(这部分内容有写文章专门分析)

共勉:人生没有一条路是白走的。每个不满意的现在,都有个不努力的曾经。一个人至少拥有一个梦想,有一个理由去坚强。

Android USB摄像头插拔监听相关推荐

  1. Android U盘插拔监听详细版以及U盘写入权限解决办法

    首先,代码都是用在项目里的,肯定是可用的.踩过的一些坑一起会写在下面.如果有更好的方法,请告知我. 用广播接收U盘插板的状态,其中插板的判断可以加入"android.intent.actio ...

  2. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  3. android 窗口监听按键,Android编程实现Dialog窗体监听的方法

    本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...

  4. android 关机消息广播,Android开机、关机播音监听

    Android开机.关机广播监听 一.开机广播的监听 1.在AndroidManifest.xml文件注册接收开机广播 2.在BroadcastReceiver里执行要做的事情 public clas ...

  5. Android DownloadManager下载完成事件监听(系列4)

     Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...

  6. Android实现双击事件的监听

    本文转自:Android实现双击事件的监听 Android实现view的双击事件监听,一般使用的场景,列表双击顶部回到第一条! 双击监听 /*** view双击监听事件*/ public class ...

  7. Android开发:优化电池续航-监听电量和充电状态

    当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始. 电池寿命通过剩余电量和充电状态来影响应用更新的执行.当用交流电充电时,执行更新操作对设备的影响是微不足道 ...

  8. android设备外接键盘实现监听事件

    需求分析 产品为一款基于android的交互终端,现在已经在android嵌入式系统上运行了一个第三方的交易软件(没有源码).在产品量产投入使用时,可以实现以下两点需求: 设备开机时自动启动交易App ...

  9. Android之自定义AlertDialog无法监听控件

    参考:http://www.cnblogs.com/511mr/archive/2011/10/21/2220253.html 要做一个自定义的弹出框,以前都是用一个Activity来实现,总觉得不是 ...

最新文章

  1. 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)
  2. 好用的工具---screen命令
  3. HDOJ 1176 免费馅饼 -- 动态规划
  4. 此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求...
  5. 多点认证wi-fi_准备使用Wi-Fi 6:认证将于2019年第三季度启动
  6. python生成和导入pyc文件
  7. 为什么有的电路中要有两单片机
  8. SpringBoot : Consider defining a bean of type xxx in your configuration.
  9. window server 下搭建sftp服务器,Freesshd安装及配置
  10. 给学习iOS开发同学的建议
  11. 基于tidbV6.0探索索引优化思路
  12. Angular2属性绑定
  13. Salesforce系列(六):Salesforce Apex基础SOQL查询和数据添加!
  14. 直播系统定制开发中安卓直播间websocket协议破解还原
  15. Java switch和break用法
  16. 传说中的“睡眠算法”的输出分析
  17. AngularJS 和 Electron 构建桌面应用
  18. JavaMail API
  19. hasChildNodes()方法,nodeName、nodeValue、nodeType介绍
  20. 用osworkflow写一个请假例子

热门文章

  1. 基于Threejs构建的3D立体空间实战入门
  2. HTML和CSS中如何设置中文字体
  3. three.js 流动线shader实现方式(伪)
  4. 分享从零开始学习网络设备配置(华为ensp版本)------任务1.2 使用eNSP搭建和配置网络
  5. html5链接access数据库,JDBC连接Access数据库的几种方式详解
  6. 操作系统——假脱机技术
  7. Access数据库手工注入
  8. 【visio使用技巧】图片导出pdf时去掉多余空白
  9. c语言重画清屏函数,写了个小程序,一直会闪屏,用的gotoxy函数,求大神教
  10. 《UNIX环境高级编程中文版》pdf