El dispositivo externo Android obtiene el controlador y obtiene el permiso de la aplicación

Tabla de contenido

 

prefacio

1. ¿Qué es UsbManager?

2. Usar pasos

1. Obtener UsbManager

2. Obtener la lista de controladores de dispositivos

3. Obtenga los parámetros del controlador conectado con el fabricante o un tercero

4. Verifique los permisos y solicite permisos

5. Ejemplo de código fuente

Resumir



prefacio

 La empresa quiere desarrollar un producto terminal, que esté conectado a muchos dispositivos, como: huella digital, reconocimiento de tarjeta de identificación, cámara de alta velocidad, etc.

Pero el dispositivo externo no puede usar la forma normal de solicitud de permiso, necesita usar UsbManager para verificar y solicitar el permiso.


1. ¿Qué es UsbManager?

UsbManager es una traducción literal de servicio, que es la clase de administración de Usb. Obtenga la instancia a través de getSystemService (AppCompatActivity.USB_SERVICE) y conecte todos los controladores al terminal del dispositivo actual a través de la función getDeviceList().

2. Usar pasos

1. Obtener UsbManager

El código es el siguiente (ejemplo):

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

2. Obtener la lista de controladores de dispositivos

usbManager.deviceList

3. Obtenga los parámetros del controlador conectado con el fabricante o un tercero

Los parámetros incluyen: identificación del producto, versión del producto, nombre del producto, identificación del controlador

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

4. Verifique los permisos y solicite permisos

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

5. Ejemplo de código fuente

El juicio aquí debe juzgarse de acuerdo con el controlador al que accede.


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<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? = 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)

            }
        }

    }

}


Resumir

Lo anterior es la etiqueta procesada por UsbManager

Supongo que te gusta

Origin blog.csdn.net/weixin_41620505/article/details/127419529
Recomendado
Clasificación