当前位置: 首页 > news >正文

Android11下APK调用USB serialn每次开机弹窗问题

[前言]最近客户做了一个Player,他的APK开机会调用ttyUSB0这个串口,客户想要去掉每次开机弹出权限确认的窗口,为此我在网上收集资料并找到一个较简单的方法提供给大家。

借鉴文章:解决绕过android下apk使用usb设备权限查询相应问题,自动获取usb权限_默认情况下用于该usb设备-CSDN博客

弹窗示例图片1

根据图片,我们定位到systemui里面,在系统文件中grep查找相关字眼

对话框的路径在

/android/frameworks/base/packages/SystemUI/res/values/strings.xml

通过关键词找到代码在

/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java

下面就是对话框的代码了

public class UsbPermissionActivity extends AlertActivity implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { private static final String TAG = "UsbPermissionActivity"; private CheckBox mAlwaysUse; private TextView mClearDefaultHint; private UsbDevice mDevice; private UsbAccessory mAccessory; private PendingIntent mPendingIntent; private String mPackageName; private int mUid; private boolean mPermissionGranted; private UsbDisconnectedReceiver mDisconnectedReceiver; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Intent intent = getIntent(); mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); mUid = intent.getIntExtra(Intent.EXTRA_UID, -1); mPackageName = intent.getStringExtra(UsbManager.EXTRA_PACKAGE); boolean canBeDefault = intent.getBooleanExtra(UsbManager.EXTRA_CAN_BE_DEFAULT, false); PackageManager packageManager = getPackageManager(); ApplicationInfo aInfo; try { aInfo = packageManager.getApplicationInfo(mPackageName, 0); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "unable to look up package name", e); finish(); return; } String appName = aInfo.loadLabel(packageManager).toString();

下面的代码时获取应用的包名,通过包名来决定是否弹出对话框

final AlertController.AlertParams ap = mAlertParams; ap.mTitle = appName; boolean useRecordWarning = false; if (mDevice == null) { // Accessory Case ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName, mAccessory.getDescription()); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); } else { boolean hasRecordPermission = PermissionChecker.checkPermissionForPreflight( this, android.Manifest.permission.RECORD_AUDIO, -1, aInfo.uid, mPackageName) == android.content.pm.PackageManager.PERMISSION_GRANTED; boolean isAudioCaptureDevice = mDevice.getHasAudioCapture(); useRecordWarning = isAudioCaptureDevice && !hasRecordPermission; int strID = useRecordWarning ? R.string.usb_device_permission_prompt_warn : R.string.usb_device_permission_prompt; ap.mMessage = getString(strID, appName, mDevice.getProductName()); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); } ap.mPositiveButtonText = getString(android.R.string.ok); ap.mNegativeButtonText = getString(android.R.string.cancel); ap.mPositiveButtonListener = this; ap.mNegativeButtonListener = this; // Don't show the "always use" checkbox if the USB/Record warning is in effect if (!useRecordWarning && canBeDefault && (mDevice != null || mAccessory != null)) { // add "open when" checkbox LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE); ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); mAlwaysUse = (CheckBox) ap.mView.findViewById(com.android.internal.R.id.alwaysUse); if (mDevice == null) { mAlwaysUse.setText(getString(R.string.always_use_accessory, appName, mAccessory.getDescription())); } else { mAlwaysUse.setText(getString(R.string.always_use_device, appName, mDevice.getProductName())); } mAlwaysUse.setOnCheckedChangeListener(this); mClearDefaultHint = (TextView)ap.mView.findViewById( com.android.internal.R.id.clearDefaultHint); mClearDefaultHint.setVisibility(View.GONE); }

下面两种方法来将讨厌的对话框去掉,做法是将应用的包名自动获取权限

1.允许所有设备获取usb权限

//setupAlert(); //允许所有设备获取usb权限 mPermissionGranted = true; finish();

2.只运行客户的apk,即包名获取usb权限,可能不止一个apk

if("com.app.signage".equals(mPackageName) || "com.app.youpackage".equals(mPackageName)) { // 包名在允许列表中 mPermissionGranted = true; finish(); } else { // 包名不在允许列表中 setupAlert(); }

if (!mPackageName.equals("com.app.signage") && !mPackageName.equals("com.app.youpackage")) { setupAlert(); // 不在允许列表,弹窗提示 } else { mPermissionGranted = true; // 在允许列表,直接授权 finish(); }

此方法来自下面代码的按钮点击回应函数

public void onClick(DialogInterface dialog, int which) { if (which == AlertDialog.BUTTON_POSITIVE) { mPermissionGranted = true; } finish(); }

这样,问题就解决了

http://www.gsyq.cn/news/1499701.html

相关文章:

  • JBrowserDriver vs 传统浏览器驱动:为什么纯Java无头方案更适合自动化测试?
  • TanStack Ranger:打造现代化滑块组件的终极无头UI解决方案
  • sublime-phpcs与版本控制集成:提交代码前自动检查的实现方法
  • 2026年6月最新版固原第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 2026深圳拆装搬家服务专业服务商推荐:家具/空调/热水器专业拆移搬迁一站式服务 - 从来都是英雄出少年
  • 扎根青岛24年!本土老牌防水楼长修楼真实测评 - 青岛防水品牌推荐
  • 邮件配置与测试:awesome-checker-services邮件相关检查工具完全手册
  • Baserow企业级无代码平台:生产环境架构解析与高性能部署指南
  • RPCS3终极指南:如何通过开源模拟器在PC上完美运行PS3游戏
  • vue表格使用 vxe-table 展开行实现产品列表与明细列表
  • Obsidian效率工具:Claudian插件的批量操作技巧
  • 如何让Continue成为你的AI编程搭档:从入门到精通的完整指南
  • 儿童益智玩具市场持续增长!国内十大新款竹蜻蜓厂家综合实力盘点(附选型建议) - 企师傅推荐官
  • MuJoCo肌腱系统深度解析:从生物力学建模到工程实践
  • 2026年6月最新版定西第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • Point Cloud Utils终极指南:5个专业技巧实现高效3D点云处理
  • 2026年6月最新版东莞第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 2026年郑州航空港区搬家公司权威分析:专业服务深度解析与选择指南 - 品研笔录
  • 如何用Mermaid.js快速绘制专业图表:从入门到精通的完整指南
  • 2026上海爱马仕包包回收推荐:首选收的顶当面鉴定高价收 - 奢侈品回收评测
  • ResponsiveFilemanager高级应用:图片自动裁剪、缩略图生成与批量操作
  • 3步上手Slint:用声明式UI构建跨平台原生应用
  • SQLBot智能问数平台企业级部署指南:3步构建对话式数据分析系统
  • 3步解锁旧Mac新生命:OpenCore Legacy Patcher终极指南
  • 2026年6月最新版沧州第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 劳保手套外贸网站如何吸引海外批发商和经销商? - 外贸营销驿站
  • 终极RPCS3汉化指南:让PS3游戏轻松支持中文的完整教程
  • 2026年 哈尔滨奥迪原厂配置升级推荐榜单:座椅加热、ACC自适应巡航、BO音响等实用改装与加装服务深度解析 - 企业推荐官【官方】
  • json2csv高级使用技巧:处理嵌套JSON数据的10个实用方法
  • KataGo围棋AI:从入门到精通的完整实战指南