[前言]最近客户做了一个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; // Dont 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权限可能不止一个apkif(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(); }这样问题就解决了