目录

前言

一、UsbManager 是什么?

二、使用步骤

1.获取UsbManager

2.获取设备驱动列表

3.和厂家或三方获取接入的驱动的参数

4、检查权限、申请权限

5、源码示例

总结



前言

公司要开发一个终端产品,这个产品外接了很多设备,比如:指纹、身份证识别、高拍仪等,

但是外接的设备不可以使用普通的权限申请的方式,要使用UsbManager 来进行权限的检查和权限申请。


一、UsbManager 是什么?

UsbManager 是个服务直译过来也就是Usb管理类,通过getSystemService(AppCompatActivity.USB_SERVICE) 获取实例,通过getDeviceList()函数可以获取到当前设备终端所链接的所有驱动。

二、使用步骤

1.获取UsbManager

代码如下(示例):

val usbManager = activity.getSystemService(AppCompatActivity.USB_SERVICE) as UsbManager

2.获取设备驱动列表

usbManager.deviceList

3.和厂家或三方获取接入的驱动的参数

参数包括:产品ID、产品版本、产品名称、驱动ID

//产品ID
val device_pid = device.productId
//供应商ID
val vendor_id = device.vendorId
//产品名称
val product_name = device.productName
//....
........

4、检查权限、申请权限

//检查权限
usbManager.hasPermission(device)
//申请权限
val intent = Intent(ACTION_USB_PERMISSION)
val pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, 0)
usbManager.requestPermission(device, pendingIntent)

5、源码示例

这里面的判断一定要根据自己接入的驱动进行判断


import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbManager
import android.os.Parcelable
import androidx.appcompat.app.AppCompatActivity
import com.example.idrdemo.IDCardUtil
import me.hgj.jetpackmvvm.ext.util.logeobject UsbPermission {var vid = -1var pid = -1private var ACTION_USB_PERMISSION = ""private val usbMgrReceiver: BroadcastReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {val action = intent.action"权限注册$action   >>  $ACTION_USB_PERMISSION >>> $pid".loge()if (ACTION_USB_PERMISSION == action) {val device =intent.getParcelableExtra<Parcelable>(UsbManager.EXTRA_DEVICE) as UsbDevice?if (device!!.vendorId == vid && device.productId == pid) {if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {"权限注册成功".loge()getManPer(context)} else {"权限注册失败".loge()getManPer(context)}}} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED == action) {val device =intent.getParcelableExtra<Parcelable>(UsbManager.EXTRA_DEVICE) as UsbDevice?if (device!!.vendorId == vid && device.productId == pid) {"权限注册成功222".loge()}} else if (UsbManager.ACTION_USB_DEVICE_DETACHED == action) {val device =intent.getParcelableExtra<Parcelable>(UsbManager.EXTRA_DEVICE) as UsbDevice?if (device!!.vendorId == vid && device.productId == pid) {"权限注册成功移除了驱动".loge()ToastUtils.showLong("驱动被移除了$ACTION_USB_PERMISSION")}}}}private var usbDevice: UsbDevice? = nullfun getManPer(activity: Context) { val usbManager = activity.getSystemService(AppCompatActivity.USB_SERVICE) as UsbManagerfor (device in usbManager.deviceList.values) {val device_pid = device.productIdval vendor_id = device.vendorIdval productName = device.productName//这里面的判断一定要根据自己接入的驱动进行判断when {vendor_id == 6997 && !usbManager.hasPermission(device) -> {usbDevice = device} //这判断有可能会出现两个驱动的 vendor_id 相等,才加的产品名称判断vendor_id == 7119 && productName?.contains("JSK-RGB") == true && !usbManager.hasPermission(device) -> {usbDevice = device}}}getPre(activity, usbManager)}private fun getPre(activity: Context, usbManager: UsbManager) {if (null == usbDevice) returnusbDevice?.let {if (!usbManager.hasPermission(it)  ) {vid = it.vendorIdpid = it.productIdACTION_USB_PERMISSION = "$vid-$pid"val filter = IntentFilter()filter.addAction(ACTION_USB_PERMISSION)filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)activity.registerReceiver(usbMgrReceiver, filter)val intent = Intent(ACTION_USB_PERMISSION)val pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, 0)usbManager.requestPermission(it, pendingIntent)}}}}

总结

上面就是对UsbManager处理的标签

Android 外接设备获取驱动和获取申请权限相关推荐

  1. Unity Android 之 Unity Android 交互(aar形式)动态申请权限功能实现(权限可人为怎加删减,并含代码工程)

    Unity Android 之 Unity Android 交互(aar形式)动态申请权限功能实现(权限可人为怎加删减,并含代码工程) 目录

  2. Android 6.0及以上版本动态申请权限,11权限

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//安卓11文件权限// 先判断有没有权限if (Environment.isExter ...

  3. Android Fragment 的妙用 - 优雅地申请权限和处理 onActivityResult

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Fragment,简称碎片,可以简单地认为它就是一个"控件",更加具体一点就是"View控制器& ...

  4. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  5. Android不同版本读取已安装应用列表权限相关问题

    转载自:https://blog.csdn.net/u010844304/article/details/111044338 如何在Android 11 上获取已安装应用列表在Android 11上, ...

  6. Android设备唯一码的获取

    Android设备唯一码的获取 UTDID是集团无线设备统一ID方案,目的是给每一台设备一个ID,作为唯一标识.UTDID由客户端生成,并在设备中各个客户端之间共享.UTDID的生成中包含时间戳和随机 ...

  7. Android 手机设备信息获取使用详解

    Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...

  8. Android设备唯一识别码的获取

    应用设备唯一识别码的解决方案 唯一标识必须满足两个特性才能完美解决定位唯一设备的问题,但这个问题的解决却注定只能极限接近完美 唯一性:标识必须在所有使用该应用的设备上保持唯一性 不变性:标识必须在同一 ...

  9. Android 手机app三种方法获取定位地址(自带API,外接SDK,获取外网IP)

    一.手机App定位在我看来有三种方法: 1.通过Android自带的API:LocationManager获取到经纬度,再通过Geocoder反地理位置查询到所在的地址. 2.外接SDK,如高德SDK ...

最新文章

  1. 如何起一个好的学术期刊论文题目?
  2. 在Aptana下安装Zen coding
  3. AWS — AWS Wavelength
  4. 修改程序配置文件 以及写一个结构体数组到文件(以及整数和结构体)
  5. IntelliJ IDEA 显示行号方法
  6. 编写JQuery插件-2
  7. c语言熵值法,干货 | R语言熵值法详解(附代码) 秒懂自定义函数
  8. CentOs 6.2 x64双网卡绑定
  9. VMware与宿主机同一网段
  10. 非Json字符串转map对象
  11. Scrapy实战,利用Scrapy简单爬取新闻并将内容储存
  12. 3、Keras中的顺序模型Sequential和函数式模型Model
  13. 计算广告学中的GFP、GSP和VCG对比
  14. vue element-ui列表中el-switch 开关,使用0和1
  15. 邮件发送(qq邮箱)
  16. 【设计模式11】备忘录和解释器模式 SpelExpressionParser
  17. 技术漫谈之——Jectpack Compose
  18. 用Java实现的eChat聊天服务器
  19. 手机号正则判断最新版 包含199、198、166开头的号码
  20. 【J2EE】J2EE简介

热门文章

  1. Spring线程池异步传递MDC信息
  2. 德国计划采用数字驾照
  3. 集度CEO夏一平:汽车机器人将融合百度文心一言的全面能力
  4. 对scipy.cluster.vq中whiten()函数总结
  5. python卡方分箱_Python评分卡建模—卡方分箱
  6. 计算机系统指挥中心,计算机的指挥中心是啥?
  7. centos7安装配置vnc,实现远程访问
  8. 如何在敏捷转型中克服阻力 -- 邀请的力量
  9. Mathtype与word字号对照
  10. DMA基本原理+实验