一、问题
app调用usb,已授权但是重启设备或者 重启应用,还是会提示授权,反复提示用户体验非常之不好,那有没有解决方案呢?答案是肯定的,涉及Android系统源码修改:
首先是类路径:
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
二、文件代码内容
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// 获取传入的意图
Intent intent = getIntent();
// 从意图中获取USB设备和USB附件对象
mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
// 从意图中获取待处理的Intent、UID和包名
mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
mPackageName = intent.getStringExtra(UsbManager.EXTRA_PACKAGE);
// 从包管理器中获取应用信息
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;
// 根据设备类型设置消息文本
if (mDevice == null) {
ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName,
mAccessory.getDescription());
mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
} else {
ap.mMessage = getString(R.string.usb_device_permission_prompt, 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;
// 如果应用可以成为默认处理程序并且存在USB设备或附件,则添加“打开时”复选框
if (canBeDefault && (mDevice != null || mAccessory != null)) {
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);
}
// 设置对话框参数并显示对话框
setupAlert();
}
三、修改
if (!useRecordWarning && mDialogHelper.canBeDefault()) {
addAlwaysUseCheckbox();
}
- setupAlert();
+ if(mDialogHelper.getAppName().toString().contains("ACDC")){
+ mDialogHelper.grantUidAccessPermission();
+ mPermissionGranted = true;
+ finish();
+ }else setupAlert();
}
或
public class UsbPermissionActivity extends AlertActivity
com.android.internal.R.id.clearDefaultHint);
mClearDefaultHint.setVisibility(View.GONE);
}
-
- setupAlert();
+//add by ltj 解决应用使用usb设备权限查询相应问题并且自动获取usb权限
+ // setupAlert();
+ mPermissionGranted = true;
+ finish();
+ //add end by ltj
}
或
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
...
// 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);
}
// grant usb permission to app start
if (!mPackageName.equals("app.package.name")){
setupAlert();
}else{
mPermissionGranted = true;
finish();
}
// grant usb permission to app end
}
参考
Android 11 默认授予第三方应用USB权限_android studio haspermission usb权限-CSDN博客