2012-11-30 101 views
0

有沒有辦法通過訪問IUsbManager接口類來調用service.grantDevicePermission()方法來自動設置USB設備的權限,而無需始終顯示ConfirmationActivity詢問用戶?Android USB自動授予權限

謝謝

回答

0

當然可以!您可以使用此代碼,爲我工作:

public boolean grantAutomaticPermission(UsbDevice usbDevice) 
{ 
    try 
    { 
    Context context=YourActivityOrApplication; 
    PackageManager pkgManager=context.getPackageManager(); 
    ApplicationInfo  appInfo=pkgManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); 

    Class serviceManagerClass=Class.forName("android.os.ServiceManager"); 
    Method getServiceMethod=serviceManagerClass.getDeclaredMethod("getService",String.class); 
    getServiceMethod.setAccessible(true); 
    android.os.IBinder binder=(android.os.IBinder)getServiceMethod.invoke(null, Context.USB_SERVICE); 

    Class iUsbManagerClass=Class.forName("android.hardware.usb.IUsbManager"); 
    Class stubClass=Class.forName("android.hardware.usb.IUsbManager$Stub"); 
    Method asInterfaceMethod=stubClass.getDeclaredMethod("asInterface", android.os.IBinder.class); 
    asInterfaceMethod.setAccessible(true); 
    Object iUsbManager=asInterfaceMethod.invoke(null, binder); 


    System.out.println("UID : " + appInfo.uid + " " + appInfo.processName + " " + appInfo.permission); 
    final Method grantDevicePermissionMethod = iUsbManagerClass.getDeclaredMethod("grantDevicePermission", UsbDevice.class,int.class); 
    grantDevicePermissionMethod.setAccessible(true); 
    grantDevicePermissionMethod.invoke(iUsbManager, usbDevice,appInfo.uid); 


    System.out.println("Method OK : " + binder + " " + iUsbManager); 
    return true; 
    } 
    catch(Exception e) 
    { 
    System.err.println("Error trying to assing automatic usb permission : "); 
    e.printStackTrace(); 
    return false; 
    } 
} 

我所做的就是實現機器人來完成這個使用反射。爲了使用此代碼,您必須具備:

<uses-permission android:name="android.permission.MANAGE_USB"/> 

但是有一個問題,我不知道確切,糾正我,如果我錯了:用戶持有的權限,而不是應用程序,那麼,如果您嘗試從應用程序儀表板啓動應用程序將會失敗。有必要確保比android開始你的應用程序,例如,將其設置爲啓動器並讓它以HOME意圖開始。

問候,期待可以幫助別人。

0

當然不是。這首先會使權限的全部無效。但用戶可以選擇始終允許特定的連接。

+0

請你擴展一下用戶如何選擇允許特定的連接?彈出窗口中有一個勾選框「此USB設備默認使用」,我已勾選,但當我拔下設備並再次插入時,我將獲得與上次相同的權限彈出窗口。理想情況下,我獲得許可的知識需要在設備重啓後繼續存在。 – kbro

1

是的,你可以,

,如果你採取被張貼@CristhianB的代碼,你將能夠把它完成,但和它的一個地獄,但你需要得到它的一個工作以下內容:

  1. 將您的應用程序移至priv-app文件夾,並將權限設置爲以系統應用程序運行。 (與用戶ID和用戶組)
  2. 一樣做@CristhianB沒有(設置該應用系統服務,這實際上是將其設置爲啓動運行運行。
  3. 與重新簽訂操作系統上鍵,然後在您的應用程序清單的Android設置權限屬性:的ProtectionLevel =「signatureOrSystem」和你是金!

第三種方法可以讓你的應用程序做任何你想要的,因爲它會使用相同的密鑰進行簽名作爲系統鍵,這意味着您作爲系統應用程序運行,但是您不必將您的應用程序安裝在priv-app文件夾中。

如果您有關於此事的任何問題,我將很樂意提供幫助,我只是實施了同樣的事情,並花了三週的時間才完成,因此我可以爲您節省大量時間。 :-)

+0

並且您將必須將 也添加到清單文件中 – Roi1981