Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK open()设备权限被拒绝_Android_Permissions_Android Ndk_Java Native Interface_V4l2 - Fatal编程技术网

Android NDK open()设备权限被拒绝

Android NDK open()设备权限被拒绝,android,permissions,android-ndk,java-native-interface,v4l2,Android,Permissions,Android Ndk,Java Native Interface,V4l2,在一个本机调用中,我试图打开(“/dev/video4”,O_RDWR),但我收到错误消息13“权限被拒绝” 如果我在同一台Android主机上的可执行文件中运行相同的代码*,与上面运行的已安装应用程序的UID相同,那么它工作正常。(*较小的差异,如main()而不是Java\u com\u test\u testOpen()) 我试过chmod666/dev/video4但仍然得到了答案,这特别奇怪 为什么在同一主机上,同一用户的同一代码在通过JNI调用时给出EACCESS,在作为独立可执行文

在一个本机调用中,我试图
打开(“/dev/video4”,O_RDWR)
,但我收到错误消息13“权限被拒绝”

如果我在同一台Android主机上的可执行文件中运行相同的代码*,与上面运行的已安装应用程序的UID相同,那么它工作正常。(*较小的差异,如
main()
而不是
Java\u com\u test\u testOpen()

我试过
chmod666/dev/video4
但仍然得到了答案,这特别奇怪

为什么在同一主机上,同一用户的同一代码在通过JNI调用时给出EACCESS,在作为独立可执行文件调用时给出success


测试设备是根化的,运行Cyanogenmod 12.1(API 22),我的目标是根化设备上>=API 21(5.0棒棒糖)。谢谢您的帮助。

由于从Android Java应用程序运行代码时出错,我猜您缺少权限。如果我没有弄错的话,您正试图访问的是摄像头,因此如果您添加:

 <uses-permission android:name="android.permission.CAMERA" />


对于您的AndroidManifest.xml,您的应用程序应该运行良好。

由于我正在使用其他小技巧构建Cyanogenmod 12.1(API 22),我可以通过以下技巧获得应用程序中
/dev/video*
的权限:

  • 对于标准Linux权限,
    android.permission.CAMERA
    似乎不再允许访问
    /dev/video*
    ,即使它们属于
    system:CAMERA
    。相反,我编辑了
    device/samsung/klte common/rootdir/etc/ueventd.qcom.rc
    ,并将
    /dev/video*
    行更改为
    0666
  • 对于SE Linux权限,我添加了一行
    allow untrusted_app video_device:chr_file rw_file_perms
    外部/隐私/不受信任的应用程序te

  • 在重建和安装映像后,我的JNI库能够访问
    /dev/video*
    ,我的客户很高兴

    答案对我来说还不够,所以我又留了一个。 OpenAPI有更多参数“模式”

    int open(常量字符*路径名、int标志、模式)

    查看链接

    您可能需要将“open”与S_IRWXU选项一起使用。 像

    打开(“/dev/video4”,O|RDWR | O|CREAT,S|IRWXU)


    谢谢,但我有这个!我的理解是,此权限会将您的应用程序UID添加到摄像头GID,但chmod 666无论如何都会覆盖此权限。另外,我发现出于安全原因(目前找不到提交或引用),这在API 22+中被删除了。它的SELinux-dmesg有如下条目:
    avc:denied{read-write}for pid=2495 comm=“est.v4l2test”name=“video4”dev=“tmpfs”ino=15110 scontext=u:r:untrusted\u应用程序:s0 tcontext=u:object\u r:video\u设备:s0 tclass=chr\u文件
    。我会在整理好后发布一个答案。现在,
    echo 0>/sys/fs/selinux/enforce
    起作用了!