2

有没有办法访问 IUsbManager 接口类来调用 service.grantDevicePermission() 方法来自动设置 USB 设备的权限,而不总是让 ConfirmationActivity 出现询问用户?

谢谢

4

3 回答 3

2

当然是的!你可以使用这个代码,为我工作:

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;
    }
 }

我所做的是实现android使用反射的方式。要使用此代码,您必须具备:

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

但是有一个问题,我不太清楚,如果我错了,请纠正我:用户拥有权限,而不是应用程序,那么如果您尝试从应用程序仪表板启动应用程序,您将失败。有必要确保 android 开始您的应用程序,例如,将其设置为启动器并让它以 HOME 意图启动。

问候,期望可以帮助某人。

于 2014-05-19T16:58:13.660 回答
2

是的你可以,

如果您采用@CristhianB 发布的代码,您将能够完成它,但这是一个地狱,您需要使用以下方法之一让它工作:

  1. 将您的应用程序移动到 priv-app 文件夹并设置权限以作为系统应用程序运行。(带有 userId 和用户组)
  2. 和@CristhianB 做的一样(设置应用程序作为系统服务运行,这实际上是设置它作为启动器运行。
  3. 使用您的密钥重新签署操作系统,然后在您的应用程序清单中设置权限属性 android:protectionLevel="signatureOrSystem" 并且您是黄金!

第三种方法允许您的应用程序做任何您想做的事情,因为它将使用与系统密钥相同的密钥进行签名,这意味着您作为系统应用程序运行,但您不必在 priv-app 文件夹中安装您的应用程序。

如果您对此事有任何疑问,我很乐意为您提供帮助,我刚刚实施了同样的事情,我花了三周时间才完成它,这样我可以为您节省很多时间。:-)

于 2015-11-05T22:10:44.527 回答
-1

当然不是。这将使首先获得权限的全部意义无效。但是用户可以选择总是允许特定的连接。

于 2012-11-30T16:02:51.587 回答