我正在开发一个通过jni使用libusb的应用程序。 此应用程序目前仅针对rooted,usb-host Android 3+机器。
方案如下:
<java Activity>
loads <jni_wrapper.so>
which wraps <my_main_lib.so>
that uses <libusb.so>
that needs rw access to: /dev/bus/usb/<device>
所有.so本机库都是我在/ system / lib上安装(作为root)的基础结构的一部分, 然后可以由java活动使用,由简单用户运行。
这意味着整个usb通信必须从本地进行。
我得到了一切正常工作,除了一个问题 - usb权限: / dev / bus / usb / entries的默认权限是(0660,uid = root,gid = usb)。
显然,运行本机代码的标准java进程不符合上述任何要求,迫使我“chmod 666”相应的/ dev条目,以使其正常工作。 但是,这个解决方案并不是那么好,因为它不会在重启或设备拔出/重新插入后继续存在(权限会回到0660)。我正在寻找的解决方案需要:
我想到的方向:
任何想法? : - )
谢谢!
答案 0 :(得分:2)
我遇到了同样的问题,我在ndk中解决了这个问题,更改/ proc / bus / usb,以便在你的情况下安装usb。希望能帮助到你。
r = system("su -c \"chmod -R 777 /proc/bus/usb/\"");
if(r!=0) {
LOGD("Could not grant permissions to USB\n");
eturn CANT_GRAN_PERMISSION_USB;
}
答案 1 :(得分:2)
libusb开发团队有一些方法。对于我的情况,我选择第一种方法。
从:https://github.com/libusb/libusb/blob/master/android/README
运行时权限:
大多数Android设备上的默认系统配置都不允许 访问USB设备。有几种方法可以改变这种情况。
如果您可以控制系统映像,则可以修改 ueventd.rc用于在图像中更改权限 的/ dev /总线/ USB / / 的。如果使用这种方法,那么建议 创建新的Android权限以保护对这些文件的访问。它 不建议为所有应用程序提供读写权限 这些文件。
对于有根设备,使用libusb的代码可以以root身份执行 使用&#34; su&#34;命令。另一种方法是使用&#34; su&#34; 命令更改相应/ dev / bus / usb /上的权限 文件。
用户报告使用android.hardware.usb.UsbManager成功 请求允许使用UsbDevice然后打开 设备。这种方法的困难在于无法保证 它将继续在未来的Android版本中运行 需要调用Java API并运行代码来匹配每个API android.hardware.usb.UsbDevice到libusb_device。
答案 2 :(得分:1)
修改:
重新阅读问题之后,很明显我误解了主机正在运行Android。由于Android中不存在udev,下面的答案不能回答这个问题。我在这里留下这个答案,万一有人正在寻找有关获取非Android Linux主机PC认可的Android设备的信息。
结束修改
这些驱动程序的默认权限(/ dev / bus / usb / ### / ###)由udev决定。特别是,它按数字顺序解析/etc/udev/rules.d和/lib/udev/rules.d中的配置文件以确定默认值。
要覆盖默认值,您需要创建自己的udev .rules文件。为此,您需要要授予其权限的设备的供应商ID。 lsusb将打印出任何特定设备的设备ID,如果您想要所有供应商的列表,可以尝试this。
因此,在您的/etc/udev/rules.d/99-android.rules文件中,为您要支持的每个供应商填写以下行:
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE:="0666"
请注意,在上面链接的示例中,它们使用=而不是:=和SYSFS而不是ATTRS。我不知道为什么,但我发现该文件在我的机器上没有逐字记录。
写完文件后,
restart usbserial
然后重新插入您的设备。它现在应该默认为666权限。
答案 3 :(得分:1)
我找到了解决方案而没有生根设备。
在Android 4.2.2内核版本3.3.39上测试
您需要做的就是将您的申请表添加到论坛&#34; usb&#34;
如果没有root,您可以使用/system/etc/permissions/platform.xml
中的权限文件选择一个您不会使用的权限,例如&#34; android.permission.CAMERA&#34;。
修改/system/etc/permissions/platform.xml,如下所示:
<permissions>
...
<permission name="android.permission.CAMERA" >
<group gid="camera" />
</permission>
<permission name="android.permission.CAMERA" >
<group gid="usb" />
</permission>
...
</permissions>
因此,将<uses-permission android:name="android.permission.CAMERA" />
添加到您的应用程序清单文件中,并享受libusb access usb!