目录
公司要开发一个终端产品,这个产品外接了很多设备,比如:指纹、身份证识别、高拍仪等,
但是外接的设备不可以使用普通的权限申请的方式,要使用UsbManager 来进行权限的检查和权限申请。
UsbManager 是个服务直译过来也就是Usb管理类,通过getSystemService(AppCompatActivity.USB_SERVICE) 获取实例,通过getDeviceList()函数可以获取到当前设备终端所链接的所有驱动。
代码如下(示例):
val usbManager = activity.getSystemService(AppCompatActivity.USB_SERVICE) as UsbManager
usbManager.deviceList
参数包括:产品ID、产品版本、产品名称、驱动ID
- //产品ID
- val device_pid = device.productId
- //供应商ID
- val vendor_id = device.vendorId
- //产品名称
- val product_name = device.productName
- //....
- ........
- //检查权限
- usbManager.hasPermission(device)
- //申请权限
- val intent = Intent(ACTION_USB_PERMISSION)
- val pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, 0)
- usbManager.requestPermission(device, pendingIntent)
这里面的判断一定要根据自己接入的驱动进行判断
-
- 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.loge
-
-
- object UsbPermission {
-
- var vid = -1
- var pid = -1
-
- private 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
(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
(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
(UsbManager.EXTRA_DEVICE) as UsbDevice? - if (device!!.vendorId == vid && device.productId == pid) {
- "权限注册成功移除了驱动".loge()
- ToastUtils.showLong("驱动被移除了$ACTION_USB_PERMISSION")
- }
- }
- }
- }
-
-
- private var usbDevice: UsbDevice? = null
-
- fun getManPer(activity: Context) {
- val usbManager = activity.getSystemService(AppCompatActivity.USB_SERVICE) as UsbManager
- for (device in usbManager.deviceList.values) {
- val device_pid = device.productId
- val vendor_id = device.vendorId
- val 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) return
-
- usbDevice?.let {
- if (!usbManager.hasPermission(it) ) {
- vid = it.vendorId
- pid = it.productId
- ACTION_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处理的标签