0

我已经构建了一个使用外部 USB 摄像头的 Android 应用程序。相机图像全屏显示,应用程序截取屏幕截图,并将它们存储在本地文件系统中。连接 USB 摄像头后,它会创建并流式传输到以下文件夹;

/dev/video0

每次断开相机连接时,该文件夹都会被销毁。

这个问题是我的应用程序没有从这个文件夹中读取的权限。所以每次连接相机时我都必须设置权限。

我试图让应用程序自动设置权限,使用以下代码;

Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});        
sh.waitFor();

...它要求用户授予超级用户权限,并给我反馈,告诉我用户现在是 root - 但我可以通过终端看到文件夹的权限没有更改。

任何帮助将不胜感激

4

4 回答 4

3

shell 支持通过 stdin 读取命令(就像您使用 OutputStream 所做的那样)或作为 -c 命令行选项的参数。例如,如果您不想创建额外的对象,这也应该有效:

Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "/system/bin/sh -c \"chmod 666 /dev/video0\""});

这转化为在 shell 中执行:

su -c "/system/bin/sh -c \"chmod 666 /dev/video0\""

如果需要,您可以先在 adb 中试用。

在这种特殊情况下,因为无论如何您只执行一个命令,所以您根本不需要 shell,可能只需要调用它:

Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "chmod 666 /dev/video0"});

还要添加到评论中,您可以编辑 ueventd.rc 文件:应该可以,但是这些文件要么位于只读 /system 分区中(通过以读写方式重新安装它很容易编辑),或者更有可能是一些ramdisk(gzip 压缩的 cpio 存档),闪存到设备上的分区。后者不会那么容易,除非您可以在闪存芯片上找到该 ramdisk 映像,将其解压缩,编辑文件,重新创建 cpio,然后将其写回闪存。

于 2013-11-20T15:52:24.427 回答
0

如果您不担心将这些权限授予相机的风险,您可以添加

/dev/video*               0666   system     camera

/ueventd.rc.

于 2013-05-03T20:46:21.630 回答
0

我最终发现以下代码效果很好;

Process sh = Runtime.getRuntime().exec("su", null,null);
OutputStream  os = sh.getOutputStream();
os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();

出于某种原因,必须通过 OutputStream 发送命令。

于 2013-05-09T15:48:36.007 回答
0

也许你只需要在 AndroidManifest.xml 中添加摄像头权限:

<uses-permission android:name="android.permission.CAMERA"/>
于 2016-02-02T06:41:09.760 回答