AndroidStudio USB:EXTRA_PERMISSION_GRANTED 返回 false - 始终

Qwe*_*zVI 3 usb android cdc

我想使用以下代码 (AndroidStudio Chipmunk) 将 USB CDC 设备(FTDI 芯片或 CD2010 或定制芯片)连接到我的 Galaxy A12 (Android SDK 30):

\n
public class MainActivity extends AppCompatActivity {\npublic static final String ACTION_USB_PERMISSION = "com.example.usbtestapp.USB_PERMISSION";\nstatic final int intentFlags = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ? PendingIntent.FLAG_IMMUTABLE : 0;\nstatic final int MY_CAMERA_PERMISSION_CODE  = 100;\nprivate Context ContextofMainAcitivity;\npublic IntentFilter USBconnectdisconnect_intentFilter;\npublic Intent GetEXTRA_PERMISSION_GRANTEDIntent;\npublic PendingIntent current_usbpermissionIntent;\npublic UsbDevice current_usbdevice;\npublic UsbManager current_usbManager;\nprivate static final String TAG = "usbtestapp";\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    ContextofMainAcitivity = this;\n    current_usbManager = (UsbManager)getSystemService(Context.USB_SERVICE);\n    USBconnectdisconnect_intentFilter = new IntentFilter();\n    USBconnectdisconnect_intentFilter.addAction(ACTION_USB_PERMISSION);\n    USBconnectdisconnect_intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);\n    USBconnectdisconnect_intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);\n    registerReceiver(currentUSBBroasdcastReceiver, USBconnectdisconnect_intentFilter);\n    GetEXTRA_PERMISSION_GRANTEDIntent = new Intent(ACTION_USB_PERMISSION);\n    GetEXTRA_PERMISSION_GRANTEDIntent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false);\n    Log.v(TAG, "Waiting for USB devices...");\n} // create\n\nBroadcastReceiver currentUSBBroasdcastReceiver = new BroadcastReceiver() {\n    public void onReceive(Context context, Intent intent) {\n        String action = intent.getAction();\n        switch (action) {\n            case UsbManager.ACTION_USB_DEVICE_ATTACHED:\n                current_usbdevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);\n                Log.v(TAG,"ACTION_USB_DEVICE_ATTACHED.");\n                if (current_usbManager.hasPermission(current_usbdevice)) {\n                    Log.v(TAG,"Permission is already granted.");\n                    return;\n                }\n                current_usbpermissionIntent = PendingIntent.getBroadcast(ContextofMainAcitivity, 0, GetEXTRA_PERMISSION_GRANTEDIntent , intentFlags);\n                if (!current_usbManager.hasPermission(current_usbdevice)) {\n                    Log.v(TAG,  "Request Permision from User...");\n                    current_usbManager.requestPermission(current_usbdevice, current_usbpermissionIntent);\n                }\n                break;\n            case UsbManager.ACTION_USB_DEVICE_DETACHED:\n                Log.v(TAG,"ACTION_USB_DEVICE_DETACHED");\n                break;\n            case ACTION_USB_PERMISSION:\n                if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED, false) == true) {\n                    Log.v(TAG,"ACTION_USB_PERMISSION - Granted !");\n                } else {\n                    Log.v(TAG,"ACTION_USB_PERMISSION - Denied");\n                }\n                break;\n        } //switch\n    } // onReceive\n}; // braadcast\n
Run Code Online (Sandbox Code Playgroud)\n

} // 班级

\n

连接 FTDI FT232 - CDC 设备后,会发生以下情况:

\n

2022-08-07 14:19:44.206 15767-15767/com.social.usbtestapp V/usbtestapp:正在等待 USB 设备...

\n

2022-08-07 14:19:50.765 15767-15767/com.social.usbtestapp V/usbtestapp:ACTION_USB_DEVICE_ATTACHED。

\n

2022-08-07 14:19:50.770 15767-15767/com.social.usbtestapp V/usbtestapp:请求用户许可...

\n

然后弹出一个对话框并显示设备字符串+询问用户权限 \xe2\x80\x93 无论选择什么“确定”或“取消”,结果始终是:

\n

2022-08-07 14:19:52.759 15767-15767/com.social.usbtestapp V/usbtestapp:ACTION_USB_PERMISSION \xe2\x80\x93 被拒绝

\n

我还检查了 FTDI 示例,但最终根据我的理解,它们的内部功能几乎相同。我还检查了 StackOverflow\njava - UsbDevice requestPermission 被拒绝而不显示请求对话框提示 - Stack Overflow 但这并没有\xe2\x80\x99t 解决了我的问题。

\n

出于任何未知的原因,我也得到了这个工作,这意味着在权限对话框中选择“确定”后, getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED 确实是 true\n同时添加或删除一些额外的 SDK\xe2\x80\x99s,例如 Lolipop 或 Pie,但我\xe2\x80\x99t 无法再重现此 \xe2\x80\x93 会很高兴收到任何建议。

\n

小智 11

在intentFlags初始化中将PendingIntent.FLAG_IMMUTABLE更改为PendingIntent.FLAG_MUTABLE。我不知道为什么它必须是 FLAG_MUTABLE 但它解决了我的问题。