通过android.hardware.usb获得的USB权限不适用于NDK

Mar*_*nov 6 permissions usb android libusb android-ndk

我能够通过Android的USB Host API获得与设备通信的权限.

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

protected void execute(Context ctxt) {
    UsbManager manager = (UsbManager) viewer.getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();

    UsbDevice d = null;
    for (String s : deviceList.keySet()) {
        d = deviceList.get(s);
    }

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(ctxt, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    viewer.registerReceiver(mUsbReceiver, filter);

    manager.requestPermission(d, mPermissionIntent);
}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                      Log.d(TAG, "Permission granted!");
                   }
                } 
                else {
                    Log.d(TAG, "permission denied for device " + device);
                }
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有赋予我的NDK代码直接与此设备通信的权限(这是libusb所需的).有没有办法在没有root的情况下将权限从Java"转移"到NDK?

PS我最终使用UNIX套接字将原始文件Descirptor从Java传输到Android本机可执行文件(我在https://github.com/martinmarinov/rtl_tcp_andro-上编写了GNU-ed项目).对于某些人来说,它会更容易,因为他们可能正在使用NDK直接连接设备(而不是第三方应用程序),因此NDK仍然可以访问它们在Java中使用的指针,而不必使用UNIX插座.

Les*_*uck 2

不可能进行权限“转移”,因为 Android 安全模型要求每个应用程序静态声明其所需的权限,并且用户在安装时批准设置的权限。不支持动态权限。每个应用程序都映射到一个 UID,并在清单中静态声明其权限。Java 不是权限边界,Dalvik VM 不构成通过 NDK 运行本机代码的障碍。所有权限都必须在清单中列出,并且 apk 可能根本不包含 Java (dex) 代码。

http://developer.android.com/guide/topics/security/permissions.html

http://osdir.com/ml/android-ndk/2012-09/msg00094.html

  • 这个答案是错误的,因为通过 unix 套接字传递文件描述符的能力(Android 自己的 Binder IPC 中也有这种能力,因此显然不是不可预见的可能性)实际上提供了一种有限的权限传输方式。 (2认同)