v1k*_*v1k 32 shell android android-ndk android-service
是否可以模拟后台应用程序(或服务)的触摸或运行sh脚本(模拟触摸)?
它需要测试Android系统没有USB或其他连接到PC,这就是为什么我不能(或不知道如何)使用Monkey或其他自动测试工具.
补充信息:我找到了使用root运行shell命令的方法(已测试的设备已植根):
无法通过android代码执行sendevent shell命令(创建触摸模拟). 在系统分区上写入文件(使用root权限运行命令)
我也得到了模拟触摸的事件.
结果我有:
//sendevent commands to simulate touch (verify it work from cmd)
String[] touchEvent = { "sendevent /dev/input/event0 0 0 0\n",
"sendevent /dev/input/event6 3 53 499\n",
"sendevent /dev/input/event6 3 54 680\n",
"sendevent /dev/input/event6 3 58 40\n",
"sendevent /dev/input/event6 3 48 3\n",
"sendevent /dev/input/event6 3 57 0\n",
"sendevent /dev/input/event6 0 2 0\n",
"sendevent /dev/input/event6 0 0 0\n",
"sendevent /dev/input/event6 0 2 0\n",
"sendevent /dev/input/event6 0 0 0\n",
"sendevent /dev/input/event0 3 0 2\n",
"sendevent /dev/input/event0 0 0 0\n"};
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 problems\n");
e.printStackTrace();
} catch (SecurityException se){
se.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我没有任何例外,但它不是触摸模拟.
任何人都可以帮忙解决这个问题吗?
如果有另一种方法在C上使用android ndk或守护进程,请告诉我它.
谢谢.
v1k*_*v1k 30
我无法执行"sendevent"命令,但为自己找到了另一种方式,希望它对某些人有用.
对于模拟触摸,我使用了android.app.Instrumentation中的sendPointerSync(),它仅适用于"android.permission.INJECT_EVENTS"权限.要使用它,您应该将您的应用程序编译为系统应用程序.为此,您应该按照以下步骤操作:
从android源码获取文件:
根的-机器人源树/出/主机//框架/ signapk.jar
根的-机器人源树/建造/目标/产品/安全/ platform.x509.pem
根的-机器人源树/建造/目标/产品/安全/ platform.pk8
使用获取文件签署您的应用:
命令" java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk "YourApp-signed.apk.
带触摸模拟的代码(模拟需要新线程):
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));
}
};
Run Code Online (Sandbox Code Playgroud)
表现:
<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" >
Run Code Online (Sandbox Code Playgroud)
使用资源:
sim*_*ons 30
当我找到一个更简单的解决方案时,我正准备实施您的解决方案 - 希望它对某人有所帮助.由于您已拥有root设备,因此无需签署系统应用程序.
要模拟位置(100,200)处的触摸,您需要使用Runtime.exec从服务中调用输入,如下所示:
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String cmd = "/system/bin/input tap 100 200\n";
os.writeBytes(cmd);
os.writeBytes("exit\n");
os.flush();
os.close();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
37144 次 |
最近记录: |