gpt4 book ai didi

android - 如何使用 sendevent 或其他方式模拟来自后台服务的触摸?

转载 作者:IT老高 更新时间:2023-10-28 21:48:19 26 4
gpt4 key购买 nike

是否可以从后台应用程序(或服务)模拟触摸或运行 sh 脚本(模拟触摸)?

在没有 USB 或其他连接到 PC 的情况下测试 android 系统需要它,这就是为什么我不能(或不知道如何)使用 Monkey 或其他自动测试工具。

添加信息:我找到了使用 root 运行 shell 命令的方法(经过测试的设备 root):

Unable to execute sendevent shell command through the android code (创建触摸模拟)。 Writing file on system partition (以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();
}

我没有任何异常(exception),但它不是触摸模拟。

谁能帮忙解决这个问题?

如果有其他方法可以在 C 上使用 android ndk 或守护进程,请告诉我。

谢谢。

最佳答案

我无法执行“sendevent”命令,但为自己找到了另一种方法,希望对某人有所帮助。

对于模拟触摸,我使用了来自 android.app.Instrumentation 的 sendPointerSync(),它仅适用于“android.permission.INJECT_EVENTS”权限。为了使用它,您应该将您的应用程序编译为系统应用程序。为此,您应该按照以下步骤操作:

  1. 从安卓源获取文件:

    root-of-android-source-tree/out/host//framework/signapk.jar

    root-of-android-source-tree/build/target/product/security/platform.x509.pem

    root-of-android-source-tree/build/target/product/security/platform.pk8

  2. 使用获取文件为您的应用签名:

    命令“java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk”YourApp-signed.apk。

  3. adb install 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));
}
};

list :

<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 - 如何使用 sendevent 或其他方式模拟来自后台服务的触摸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com