一)场景需求
项目中使用到了can协议控制车机功能,can 直接转串口,用USB转串口工具 cn.wch.uartlib 来实现. can 板子通过usb 插入到机器上面,那就是usb 协议了。
遇到问题:
- 插入can 板的usb 到机器上后,直接弹出授权框框。 需要默认不要弹出。这个逻辑是什么。【应用端解决】
- 在项目中请求usb 授权,后会有授权框框,其实就是1中的弹框。 如何默认授权,不让弹框。 这个逻辑是什么。【framework层解决】
如下图所示:
二)参考资料
android 10.0 去掉usb授权提示框 默认给予权限
USBService源码分析之Usb权限(二)
在线源码查看平台 xref
三)解决方案和源码分析
对于插入USB直接弹出弹框授权申请,如果允许就跳转到对应的app。
解决方案:
去掉应用中 USB_DEVICE_ATTCHED 的过滤器,它会直接跳转到对应的app 。 不符合需求。 故 不在热插拔逻辑的确认框.
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
热插拔确认框:
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java
修改文件
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
备注:为什么要改这里,解决问题思路:当弹出确认框的时候,去dump 确认一下当前到底是哪个activity。
在热插拔时候 弹出的是UsbConfirmActivity.java 在应用逻辑去申请请求权限的时候,弹出的是 UsbPermissionActivity.java
解决方案
在UsbPermissionActivity 界面中,默认授权, 然后结束掉自己。
//wangfangchen add
//setupAlert();
Log.d(TAG,"22222 mo ren usb quanbu shouquan... ");
mDialogHelper.grantUidAccessPermission();
mDialogHelper.setDefaultPackage();
mPermissionGranted = true;
finish();
//wangfangchen end
git