android10 去掉usb授权提示框 默认给予权限

一、问题

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博客

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值