【发布时间】:2013-06-04 04:55:37
【问题描述】:
我已授予对 UsbDevice 的访问权限,获得了他的设备名称 (/dev/bus/usb/002/002) 并将其传递给执行进程以使用 USB 设备(avrdude 更详细)
Process process = Runtime.getRuntime().exec(commandArray);
并得到“permission denied”错误:
W/System.err( 9368): avrdude: ser_open(): can't open device "/dev/bus/usb/002/002": Permission denied
W/System.err( 9368): ioctl("TIOCMGET"): Invalid argument
Avrdude 位于应用沙箱 (/data/data/%package%) 中,因此它不需要 root 即可执行 avrdude(当然)。我相信如果我授予对 UsbDevice android 应用程序进程的访问权限,并且所有子进程 (avrdude) 都可以访问相应的 USB 设备文件。
有什么想法吗?不希望生根。
【问题讨论】:
-
更新:应用程序即使在获得 UsbDevice 的权限后也无法读取/写入 USB 设备文件:
File usbDeviceFile = new File(usbDevice.getDeviceName()); logger.debug("{}exists, canRead={}, canWrite={}", new Object[] { usbDeviceFile.exists() ? "" : "NOT ", usbDeviceFile.canRead(), usbDeviceFile.canWrite() });返回:D/ArduinoDroid( 2350): device name = /dev/bus/usb/002/002 D/ArduinoDroid( 2350): exists, canRead=false, canWrite=false -
是的,它们是相同的,但这里的问题是您正在尝试在本机端使用不同的 API,应用程序和在其 UID 下运行的可执行文件都无法使用该 API .除了少数在 unix 组级别(例如网络)实现的权限之外,所有权限实际上都是基于 Binder IPC 的 API 的启用程序,除非您能找到某种方法将其注册到 Binder,否则本机可执行文件无法使用这些权限。
-
根据我的 UPDATE android 应用程序本身没有该文件的权限。所以无论如何尝试从子进程(avrdude)访问它是没有意义的。不可能?
标签: android permissions usb avrdude