kotlin中的android与USB通信存在问题

kotlin中的android与USB通信存在问题,android,kotlin,usb,Android,Kotlin,Usb,我正在尝试在我的android和USB之间通信。我按照android.com的说明操作,但我的智能手机没有要求授权与USB通信。然而,我的智能手机确实能检测到我是否安装了USB。事实上,变量“device”总是空的,我不明白为什么。你知道这个问题吗 var ACTION_USB_ATTACHED :String = “android.hardware.usb.action.USB_DEVICE_ATTACHED” var ACTION_USB_DETACHED :String = “andro

我正在尝试在我的android和USB之间通信。我按照android.com的说明操作,但我的智能手机没有要求授权与USB通信。然而,我的智能手机确实能检测到我是否安装了USB。事实上,变量“device”总是空的,我不明白为什么。你知道这个问题吗

var ACTION_USB_ATTACHED :String = “android.hardware.usb.action.USB_DEVICE_ATTACHED” 
var ACTION_USB_DETACHED :String = “android.hardware.usb.action.USB_DEVICE_DETACHED” 
var ACTION_USB_PERMISSION :String = “com.android.example.USB_PERMISSION”

class MainActivity : AppCompatActivity(){
    var switch_on_off :Switch? = null
    var tv_info : TextView? = null

    //USB
    var mUsbReceiver :UsbReceiver? = null
    var mfilter :IntentFilter? = null
    var mUsbManager :UsbManager? = null
    var mPermissionIntent : PendingIntent? = null
    var device :UsbDevice? = null

    override fun onCreate(savedInstanceState: Bundle?)  {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tv_info = findViewById<TextView>(R.id.textView)
        switch_on_off = findViewById<Switch>(R.id.switch1)
        switch_on_off!!.setChecked(false)
        switch_on_off!!.setText("OFF")

        //USB
        mUsbReceiver = UsbReceiver()
        mfilter = IntentFilter()
        mfilter!!.addAction(ACTION_USB_ATTACHED)
        mfilter!!.addAction(ACTION_USB_DETACHED)
        registerReceiver(mUsbReceiver, mfilter) 
        mUsbManager = getSystemService(Context.USB_SERVICE) as UsbManager

        //threads
        t_switchOnOff.start()
    }
    val t_switchOnOff = thread(start = false, priority = 10)
    {
        while(true){
            Thread.sleep(300)
            this@MainActivity.runOnUiThread(java.lang.Runnable {
                if(switch_on_off!!.isChecked()){
                    switch_on_off!!.setText("ON")
                    device = intent?.getParcelableExtra<UsbDevice>(UsbManager.EXTRA_DEVICE) 
                    if(device != null) 
                    {
                        if(!mUsbManager!!.hasPermission(device)){
                            mPermissionIntent = PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), 0);
                            mUsbManager!!.requestPermission(device, mPermissionIntent);
                        }
                        else{
                            tv_info!!.setText("")
                            tv_info!!.setText("device USB detected : ${device!!.deviceName} \n
                                & Authorization accorded")
                        }
                    }
                    else{
                        tv_info!!.setText("device USB NOT detected \n& usb Detached")
                    }
                }
                else{
                    tv_info!!.setText("")
                    switch_on_off!!.setText("OFF")
                }
            })//end this@MainActivity.runOnUiThread(java.lang.Runnable ...
        }
    }//end thread

    class UsbReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) { 
            val action = intent?.action
            var ACTION_USB_PERMISSION :String = "com.android.example.USB_PERMISSION"
            if (action!!.equals(ACTION_USB_DETACHED)) {}
            if (action!!.equals(ACTION_USB_ATTACHED)){}
            if (action!!.equals(ACTION_USB_PERMISSION)){
                if (!intent!!.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED,false)) {
                    //Authoization refused
                } else {
                    //Authorization accepted
                }
            }
        }
    }//end class UsbReceiver }
var ACTION\u USB\u ATTACHED:String=“android.hardware.USB.ACTION.USB\u DEVICE\u ATTACHED” var ACTION\u USB\u DETACHED:String=“android.hardware.USB.ACTION.USB\u DEVICE\u DETACHED” var ACTION_USB_PERMISSION:String=“com.android.example.USB_PERMISSION” 类MainActivity:AppCompatActivity(){ var开关打开或关闭:开关?=null var tv_信息:文本视图?=空 //USB var mUsbReceiver:UsbReceiver?=null var mfilter:IntentFilter?=null var mUsbManager:UsbManager?=null var mPermissionIntent:PendingIntent?=null 变量设备:UsbDevice?=null 重写创建时的乐趣(savedInstanceState:Bundle?){ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tv_info=findviewbyd(R.id.textView) 打开/关闭开关=findViewById(R.id.switch1) 打开/关闭开关!!.setChecked(false) 打开/关闭!!.setText(“关闭”) //USB mUsbReceiver=UsbReceiver() mfilter=IntentFilter() mfilter!!.addAction(操作\u USB\u已连接) mfilter!!.addAction(操作\u USB\u分离) 注册接收者(mUsbReceiver,mfilter) mUsbManager=getSystemService(Context.USB_服务)作为UsbManager //线程 t_switchOnOff.start() } val t_switchOnOff=线程(开始=错误,优先级=10) { while(true){ 线程。睡眠(300) this@MainActivity.runOnUiThread(java.lang.Runnable){ 如果(打开/关闭!!.isChecked()){ 打开或关闭!!.setText(“打开”) device=intent?.getParcelableExtra(UsbManager.EXTRA_设备) 如果(设备!=null) { 如果(!mUsbManager!!.hasPermission(设备)){ mPermissionIntent=pendingent.getBroadcast(this,0,Intent(ACTION\u USB\u PERMISSION),0); mUsbManager!!.requestPermission(设备、mPermissionIntent); } 否则{ 电视信息!!.setText(“”) tv_info!!.setText(“检测到设备USB:${device!!.deviceName}\n &授权书“) } } 否则{ tv_info!!.setText(“未检测到设备USB\n USB分离(&U)) } } 否则{ 电视信息!!.setText(“”) 打开/关闭!!.setText(“关闭”) } })//结束this@MainActivity.runOnUiThread(java.lang.Runnable。。。 } }//端螺纹 类UsbReceiver:BroadcastReceiver(){ 覆盖接收(上下文:上下文?,意图:意图?{ val动作=意图?动作 var ACTION_USB_PERMISSION:String=“com.android.example.USB_PERMISSION” 如果(action!!.equals(action_-USB_-DETACHED)){} 如果(action!!.equals(action_-USB_-ATTACHED)){} if(action!!.equals(action\u USB\u权限)){ 如果(!intent!!.getBooleanExtra(已授予UsbManager.EXTRA权限,false)){ //拒绝授权 }否则{ //接受授权 } } } }//端类UsbReceiver}
感谢您的帮助

实际上,您必须为每个可用的USB设备请求许可,Android官方文档并没有真正强调这一点

// register the broadcast receiver
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
val permissionIntent = PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), 0)
val filter = IntentFilter(ACTION_USB_PERMISSION)
registerReceiver(usbReceiver, filter)

for (dev in manager.deviceList)
{
    // returns hashmap<String, UsbDevice>
    Log.i("TAG", dev.key + " " + dev.value)
    // now ask for permission
    manager.requestPermission(dev.value, permissionIntent)
}
//注册广播接收器
val manager=getSystemService(Context.USB_服务)作为UsbManager
val permissionIntent=pendingent.getBroadcast(this,0,Intent(ACTION\u USB\u PERMISSION),0)
val filter=IntentFilter(操作\u USB\u权限)
寄存器接收器(usbReceiver,过滤器)
for(manager.deviceList中的开发)
{
//返回哈希映射
Log.i(“标记”,dev.key+“”+dev.value)
//现在请求许可
manager.requestPermission(dev.value、permissionIntent)
}

当我发现设备未找到问题时,我要做的第一件事是从命令行或adb所在的位置运行“adb设备”。