【问题标题】:Android USB Automatically Grant PermissionAndroid USB 自动授予权限
【发布时间】:2012-11-30 14:54:35
【问题描述】:

是否可以访问 IUsbManager 接口类来调用 service.grantDevicePermission() 方法来自动设置 USB 设备的权限,而不总是让 ConfirmationActivity 显示询问用户?

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

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

    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 意图启动。

    您好,期待可以帮助某人。

    【讨论】:

    • Error trying to assing automatic usb permission : java.lang.NoSuchMethodException: grantDevicePermission [class android.hardware.usb.UsbDevice, int]
    • 找到适用于 Android 9 的解决方案 stackoverflow.com/a/57622623/7767664
    • MANAGE_USB 仅适用于系统应用
    【解决方案2】:

    是的,你可以,

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

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

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

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

    【讨论】:

    • 您还必须将 添加到清单文件中
    【解决方案3】:

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

    【讨论】:

    • 请您详细说明用户如何选择允许特定连接?弹出窗口有一个复选框“默认情况下用于此 USB 设备”,我已勾选,但是当我拔下设备并重新插入时,我得到与上次相同的权限弹出窗口。理想情况下,我已授予权限的知识需要在设备重启后仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多