Android 外部デバイスがドライバーを取得し、アプリケーションの許可を取得します

目次

 

序文

1.USBマネージャーとは何ですか?

2. ステップを使用する

1.USBマネージャーを入手する

2. デバイスドライバーリストの取得

3. 接続されているドライバのパラメータをメーカーまたはサードパーティから取得します。

4. 権限を確認し、権限を申請する

5. ソースコード例

要約する



序文

 同社は、指紋、ID カード認識、高速カメラなど、多くのデバイスに接続される端末製品を開発したいと考えています。

ただし、外部デバイスは通常の許可申請方法を使用できず、 UsbManager を使用して許可を確認して申請する必要があります。


1.USBマネージャーとは何ですか?

UsbManager は、USB 管理クラスであるサービスのリテラル翻訳であり、getSystemService(AppCompatActivity.USB_SERVICE) を通じてインスタンスを取得し、getDeviceList() 関数を通じて現在のデバイス端末に接続されているすべてのドライバーを取得します。

2. ステップを使用する

1.USBマネージャーを入手する

コードは次のとおりです(例)。

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.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)

            }
        }

    }

}


要約する

上記は、UsbManager によって処理されたラベルです

おすすめ

転載: blog.csdn.net/weixin_41620505/article/details/127419529