• Android 外接设备获取驱动和获取申请权限


    目录

     

    前言

    一、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

    1. //产品ID
    2. val device_pid = device.productId
    3. //供应商ID
    4. val vendor_id = device.vendorId
    5. //产品名称
    6. val product_name = device.productName
    7. //....
    8. ........

    4、检查权限、申请权限

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

    5、源码示例

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

    1. import android.app.PendingIntent
    2. import android.content.BroadcastReceiver
    3. import android.content.Context
    4. import android.content.Intent
    5. import android.content.IntentFilter
    6. import android.hardware.usb.UsbDevice
    7. import android.hardware.usb.UsbManager
    8. import android.os.Parcelable
    9. import androidx.appcompat.app.AppCompatActivity
    10. import com.example.idrdemo.IDCardUtil
    11. import me.hgj.jetpackmvvm.ext.util.loge
    12. object UsbPermission {
    13. var vid = -1
    14. var pid = -1
    15. private var ACTION_USB_PERMISSION = ""
    16. private val usbMgrReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    17. override fun onReceive(context: Context, intent: Intent) {
    18. val action = intent.action
    19. "权限注册$action >> $ACTION_USB_PERMISSION >>> $pid".loge()
    20. if (ACTION_USB_PERMISSION == action) {
    21. val device =
    22. intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) as UsbDevice?
    23. if (device!!.vendorId == vid && device.productId == pid) {
    24. if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
    25. "权限注册成功".loge()
    26. getManPer(context)
    27. } else {
    28. "权限注册失败".loge()
    29. getManPer(context)
    30. }
    31. }
    32. } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED == action) {
    33. val device =
    34. intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) as UsbDevice?
    35. if (device!!.vendorId == vid && device.productId == pid) {
    36. "权限注册成功222".loge()
    37. }
    38. } else if (UsbManager.ACTION_USB_DEVICE_DETACHED == action) {
    39. val device =
    40. intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) as UsbDevice?
    41. if (device!!.vendorId == vid && device.productId == pid) {
    42. "权限注册成功移除了驱动".loge()
    43. ToastUtils.showLong("驱动被移除了$ACTION_USB_PERMISSION")
    44. }
    45. }
    46. }
    47. }
    48. private var usbDevice: UsbDevice? = null
    49. fun getManPer(activity: Context) {
    50. val usbManager = activity.getSystemService(AppCompatActivity.USB_SERVICE) as UsbManager
    51. for (device in usbManager.deviceList.values) {
    52. val device_pid = device.productId
    53. val vendor_id = device.vendorId
    54. val productName = device.productName
    55. //这里面的判断一定要根据自己接入的驱动进行判断
    56. when {
    57. vendor_id == 6997 && !usbManager.hasPermission(device) -> {
    58. usbDevice = device
    59. }
    60. //这判断有可能会出现两个驱动的 vendor_id 相等,才加的产品名称判断
    61. vendor_id == 7119 && productName?.contains("JSK-RGB") == true && !usbManager.hasPermission(
    62. device
    63. ) -> {
    64. usbDevice = device
    65. }
    66. }
    67. }
    68. getPre(activity, usbManager)
    69. }
    70. private fun getPre(activity: Context, usbManager: UsbManager) {
    71. if (null == usbDevice) return
    72. usbDevice?.let {
    73. if (!usbManager.hasPermission(it) ) {
    74. vid = it.vendorId
    75. pid = it.productId
    76. ACTION_USB_PERMISSION = "$vid-$pid"
    77. val filter = IntentFilter()
    78. filter.addAction(ACTION_USB_PERMISSION)
    79. filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
    80. filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
    81. activity.registerReceiver(usbMgrReceiver, filter)
    82. val intent = Intent(ACTION_USB_PERMISSION)
    83. val pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, 0)
    84. usbManager.requestPermission(it, pendingIntent)
    85. }
    86. }
    87. }
    88. }


    总结

    上面就是对UsbManager处理的标签

  • 相关阅读:
    编码技巧——Mybatis分页插件PageHelper使用
    栅格转换为CSV数据时如何优化数据文件的大小
    关于华为设备vlan接口的总结
    WebUI文件拖拽上传与下载文件
    prometheus使用数据源的timestamp而非server的timestamp
    python经典百题之寻找完数
    【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化
    makefile之链接静态库
    测试开发环境下centos7.9下安装docker的minio
    计算机毕业设计Java旅游攻略开发系统(源码+mysql数据库+系统+lw文档)
  • 原文地址:https://blog.csdn.net/weixin_41620505/article/details/127419529