【问题标题】:USB permission obtained via android.hardware.usb does not apply to NDK通过 android.hardware.usb 获得的 USB 权限不适用于 NDK
【发布时间】:2012-12-08 09:17:21
【问题描述】:

我能够通过 Android 的 USB 主机 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);
                }
            }
        }
    }
};

不幸的是,我的 NDK 代码没有直接与该设备通信的权限(这是 libusb 所必需的)。有什么方法可以在没有root的情况下将权限从Java“转移”到NDK?

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

【问题讨论】:

    标签: android permissions android-ndk usb libusb


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以您的意思是,每当我通过 Java USB Host API 访问 USB 设备时,我实际上是在使用以 root 身份运行的代理进行通信,因此它是管理访问的代理到这个设备?
    • Android 中的 USB 访问意味着有权访问 /dev/bus/usb/*。此权限是通过清单静态建立的。您可以通过 NDK 直接访问设备,但每个 Android 设备都有不同的 USB 硬件芯片、驱动程序等。我认为应用程序在 Android 设备上运行的唯一方法是通过支持的 Java SDK 主机接口,它使用供应商的驱动程序。见libusb on Android
    • 这个答案是错误的,因为通过 unix 套接字传递文件描述符的能力(在 Android 自己的 Binder IPC 中也复制了这种能力,因此显然不是不可预见的可能性)实际上提供了一种有限的传输方式权限。
    猜你喜欢
    • 2012-04-19
    • 2021-02-14
    • 2019-11-12
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多