1. 程式人生 > >Android定製:去掉USB許可權彈窗

Android定製:去掉USB許可權彈窗

引言

當我們在訪問一個插入到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隱藏介面的辦法,此方法也需要編譯原始碼且比較複雜故而忽略。