Android 默认允许USB设备授权
问题描述
客户apk会访问usb的摄像头,每次打开apk时,都会出现一个权限弹窗,提示“是否允许xxx应用访问xxx设备”。需求是去掉这个弹窗,默认允许所有USB设备的访问授权。
解决方法
加入该补丁即可,适用于rk3588 Android13。
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
index 9484d3a638..6863f82f6b 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
@@ -18,6 +18,7 @@ package com.android.systemui.usb;
import android.content.res.Resources;
import android.os.Bundle;
+import android.util.Log;
import javax.inject.Inject;
@@ -25,9 +26,11 @@ import javax.inject.Inject;
* Dialog shown when a package requests access to a USB device or accessory.
*/
public class UsbPermissionActivity extends UsbDialogActivity {
-
+ private static final String TAG = "UsbAutoGrant";
+
private boolean mPermissionGranted = false;
private UsbAudioWarningDialogMessage mUsbPermissionMessageHandler;
+ private boolean mAutoGranted = false; // 新增标志位
@Inject
public UsbPermissionActivity(UsbAudioWarningDialogMessage usbAudioWarningDialogMessage) {
@@ -44,6 +47,22 @@ public class UsbPermissionActivity extends UsbDialogActivity {
@Override
protected void onResume() {
super.onResume();
+
+ // === 自动授权逻辑 ===
+ Log.d(TAG, "[witheart] 检测到USB权限请求,自动授予权限");
+
+ // 自动执行确认操作
+ onConfirm();
+ mAutoGranted = true; // 标记为自动授权
+
+ // 立即结束Activity,避免显示对话框
+ finish();
+
+ // 由于立即finish(),以下原始代码不会执行
+ return;
+
+ // 原始代码(保留但不会执行)
+ /*
final boolean useRecordWarning = mDialogHelper.isUsbDevice()
&& (mDialogHelper.deviceHasAudioCapture()
&& !mDialogHelper.packageHasAudioRecordingPermission());
@@ -62,11 +81,13 @@ public class UsbPermissionActivity extends UsbDialogActivity {
addAlwaysUseCheckbox();
}
setupAlert();
+ */
}
@Override
protected void onPause() {
- if (isFinishing()) {
+ // 只处理手动授权的情况
+ if (!mAutoGranted && isFinishing()) {
mDialogHelper.sendPermissionDialogResponse(mPermissionGranted);
}
super.onPause();
@@ -74,11 +95,13 @@ public class UsbPermissionActivity extends UsbDialogActivity {
@Override
void onConfirm() {
+ Log.d(TAG, "[witheart] USB自动授权: " + mDialogHelper.getAppName() + " | "
+ + mDialogHelper.getDeviceDescription());
+
mDialogHelper.grantUidAccessPermission();
if (isAlwaysUseChecked()) {
mDialogHelper.setDefaultPackage();
}
mPermissionGranted = true;
- finish();
}
-}
+}
\ No newline at end of file
解决步骤
- 弹出权限弹窗后,logcat捕捉日志:
08-05 16:55:04.238 548 564 D CoreBackPreview: Window{139bb97 u0 com.android.systemui/com.android.systemui.usb.UsbPermissionActivity}: Setting back callback null可定位到: 包名:com.android.systemui 类名:com.android.systemui.usb.UsbPermissionActivity 路径推导:packages/SystemUI/src/com/android/systemui/usb/
由此找到frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
- 在onResume中直接调用onConfirm,直接确认,并且确认后调用finish,结束activity
- 然后将原来onConfirm中的finish去掉
留下评论