Android定製:去掉USB許可權彈窗
阿新 • • 發佈:2019-02-05
引言
當我們在訪問一個插入到Android系統的USB裝置的時候往往是需要許可權的,此時系統會彈出詢問許可權的對話方塊,而我們此時希望讓它預設允許訪問USB裝置並且不希望使用者看到這個對話方塊。
原始碼:非官方Android5.1原始碼
描述
我們在獲取UsbManager和UsbDevice/UsbAcessory之後,首先需要檢查是否對這個USB裝置/附件有操作的許可權,如果沒有許可權,則需要向系統申請(系統會彈出詢問許可權的對話方塊),此時需要註冊一個廣播接收器用來接收使用者的選擇。
// 檢查是否有操作許可權
boolean hasPermission = mUsbManager.hasPermission(mUsbDevice);
if (!hasPermission) {
// 註冊廣播,接收使用者許可權選擇
PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, new Intent(TAG_UsbPermission), 0);
mContext.registerReceiver(new MyPermissionReceiver(), new IntentFilter(TAG_UsbPermission));
// 彈出對話方塊,申請許可權
mUsbManager.requestPermission(mUsbDevice, pi);
}
下面是我們定義的廣播接收器:
// 定義的廣播接收器
private class MyPermissionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(TAG_UsbPermission)) {
boolean granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false );
if (!granted) {
// Todo:已經獲取許可權,可以執行其他操作
} else {
// Todo:未獲取許可權。
}
}
}
}
在這個過程中,系統會彈出詢問許可權的對話方塊,而我們現在不希望使用者看到這個介面。
方法
進入系統原始碼,找到檔案
/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
找到其中的 onCreate() 方法,替換
setupAlert();
為
mPermissionGranted = true;
finish();
這樣就不會彈窗了,並且會允許給裝置操作許可權。
當然我們也可以指定只有我們自己的APP不需要彈窗,只需要加一層過濾條件即可:
// add permission for our packages!
if(mPackageName.startsWith("com.xxx.xxx")) {
mPermissionGranted = true;
finish();
} else {
setupAlert();
}
當然也可以根據裝置的VID、PID、裝置名稱等資訊進行過濾(省略)。
後記
解決方法源於原始碼 UsbPermissionActivity.java 中的 onClick() 方法:
public void onClick(DialogInterface dialog, int which) {
if (which == AlertDialog.BUTTON_POSITIVE) {
mPermissionGranted = true;
}
finish();
}
網上還有一種使用AIDL實現Android隱藏介面的辦法,此方法也需要編譯原始碼且比較複雜故而忽略。