JNI打开 /dev/input/event 返回 -1 /dev/input/event无权限 Permission denied

本人门外汉一个。博客所提及的一些东西均百度得来 (如果哪里不对请指出)

先记录一下我碰到的问题。折磨了我好多天

	做一个比较特殊的功能  安卓触摸事件注入,(模拟安卓触摸操作)
	我碰到的问题如下面这个链接(权限问题):
	遗憾的是这个帖子的提问并没有得到解决
	
	https://bbs.csdn.net/topics/390945886?list=lz

下面的操作都需要设备有root权限。

本来模拟点击 使用adb命令可以很轻松的实现该功能。
例如:
JNI打开 /dev/input/event 返回 -1 /dev/input/event无权限 Permission denied_第1张图片
JNI打开 /dev/input/event 返回 -1 /dev/input/event无权限 Permission denied_第2张图片

但是我实际测试了这样操作,有一个很大的弊端,。发送的命令要好久才能响应的到(卡卡的感觉)

接下来就是一顿百度猛如虎

得到结论是 JNI直接打开设备 /dev/input/eventx 往里面写事件

于是有了下面的代码:

	int Init(const char* path)
	{
		LOGI("开始初始化");
		TOUCH_FD = open(path, O_RDWR);//O_RDWR

		if (TOUCH_FD < 0) {
			LOGI("erro: %s\n", strerror(errno));
			LOGI("Open touch screen file discriptor error!%d", TOUCH_FD);
			LOGI("erro code %d.\r\n", errno);
			return TOUCH_FD;
		}
		return 0;
	}

运行这段代码之前我已经申请了root权限
并且给了路径" chmod 777 " + "/dev/input/event5"这样的权限
但是无论怎么测试都是返回-1 Permission denied
接下来就开始煎熬了。。。
爬了好几天谷歌

下面贴一下我的解决方案
测试手机小米4 android 7

adb控制台 先执行setenforce 0
设置SELinux 成为permissive模式 临时关闭selinux的
代码中加入 如下这样:

                List commands = new List();
                commands.Add("chmod 777 " + "/dev/input/event" + 1.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 2.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 3.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 4.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 5.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 6.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 7.ToString());
                commands.Add("chmod 777 " + "/dev/input/event" + 8.ToString());
                commands.Add("setenforce 0");
                ret = ShellUtils.execCommand(commands, true, true);

然后就可以愉快的打开设备了。

据了解SELinux 从4.3版本就已经集成了,默认permissive模式。
但安卓5.0又强化了一下,强制enforcing模式,导致这样的问题。
可能是保护机制吧。。

贴一下我找到原因的原文链接(可能访问要架梯子)
https://www.pocketmagic.net/programmatically-injecting-events-on-android-part-2/

你可能感兴趣的:(xamarin,android,c#)