是否可以从后台应用程序(或服务)模拟触摸或运行sh脚本(模拟触摸)?
它是测试没有USB或其他连接到PC的android系统所需要的,这就是为什么我不能(或不知道如何)使用Monkey或其他自动测试工具。
添加的信息:我找到了用root运行shell命令的方法(测试的设备root):
无法通过android代码执行sendevent shell命令(创建触摸模拟)。在系统分区上写入文件(使用root权限运行命令)
此外,我还有一些模拟触摸的活动。
结果我有:
//sendevent commands to simulate touch (verify it work from cmd)
String[] touchEvent = { "sendevent /dev/input/event0 0 0 0n",
"sendevent /dev/input/event6 3 53 499n",
"sendevent /dev/input/event6 3 54 680n",
"sendevent /dev/input/event6 3 58 40n",
"sendevent /dev/input/event6 3 48 3n",
"sendevent /dev/input/event6 3 57 0n",
"sendevent /dev/input/event6 0 2 0n",
"sendevent /dev/input/event6 0 0 0n",
"sendevent /dev/input/event6 0 2 0n",
"sendevent /dev/input/event6 0 0 0n",
"sendevent /dev/input/event0 3 0 2n",
"sendevent /dev/input/event0 0 0 0n"};
try{
Thread.sleep(2000);
Process root = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(root.getOutputStream());
for(int i = 0; i < touchEvent.length; i++){
Log.i(TAG, touchEvent[i]);
os.writeBytes(touchEvent[i]);
os.flush();
}
root.waitFor();
} catch (IOException e) {
Log.e(TAG, "Runtime problemsn");
e.printStackTrace();
} catch (SecurityException se){
se.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
我没有任何例外,但它不是触摸模拟。
有人能帮忙解决这个问题吗?
如果有另一种方法可以在C上使用android ndk或守护进程,请告诉我。
谢谢。
我不能执行"sendevent"命令,但我为自己找到了另一种方法,希望它能对某人有所帮助。
对于模拟触摸,我使用了android.app.Instrumentation中的sendPointerSync(),它只适用于"android.permission.INJECT_EVENTS"权限。为了使用它,你应该将你的应用程序编译为系统应用程序。要做到这一点,您应该遵循以下步骤:
-
从android获取文件来源:
android源代码树的根/out/host//framework/signapk.jar
android源代码树/build/target/product/security/platform.x509.pem的根
android源代码树的根目录/build/target/product/security/platform.pk8
-
使用获取文件对应用程序进行签名:
命令"java-jar signapk.jar platform.x509.pem platform.pk8 YourApp unsigned.apk"YourApp-signed.apk.
- adb安装YourApp-signed.apk
- 运行你的应用程序
- 使用"adb shell ps"确认您的应用程序正在作为系统运行
带有触摸模拟的代码(模拟需要新线程):
Thread thread = new Thread(){
@Override
public void run(){
Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendPointerSync(MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN,posx, posy, 0));
m_Instrumentation.sendPointerSync(MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP,width*4/5,height, 0));
}
};
清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp"
**android:sharedUserId="android.uid.system"**
android:versionCode="1"
android:versionName="1.0" >
使用资源:
- Android上的程序注入事件-第1部分
- 如何使用系统权限编译Android应用程序
- 此处编译说明
我正要实现您的解决方案时,发现了一个更简单的解决方案——发布希望它能对某人有所帮助。由于你已经有了一个根设备,你不需要以系统应用程序的身份登录。
要模拟在位置(100200)的触摸,您只需要使用Runtime.exc从服务中调用input,如下所示:
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String cmd = "/system/bin/input tap 100 200n";
os.writeBytes(cmd);
os.writeBytes("exitn");
os.flush();
os.close();
process.waitFor();
您可以使用"滑动"输入。查看Input.java源代码,您可以看到进行滑动所需的参数。
以下是我为模拟刷卡玩烟雾游戏而做的一个要点,点击而不是刷卡只是为了测试这一点。不过,您需要超级用户访问权限才能使用此实现。