java - 如何点击Android中的其他应用程序?
问题描述
过去几天我一直在研究如何为 Android 创建自动点击器,但我没有找到任何解决方案。我想像许多 Play Store 相关应用程序一样,无根地进行。
此代码允许我以编程方式命令单击,但当我退出应用程序时它不起作用:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Process p;
StringBuffer output = new StringBuffer();
try {
p = Runtime.getRuntime().exec("input tap 950 581");
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
}
catch (IOException e) {
e.printStackTrace();
}
}
}, 5000);
对不起英语。
解决方案
经过几次尝试,我终于明白了。感谢@Vaibhav,他建议我在评论中提供一个很好的链接。此外,我向Macrorify KoK-CODE公司发送了一封电子邮件,他们帮助我了解了自动点击器的工作原理。谢谢!=)
我将保留在此处找到的初始解决方案(只需单击一下)。我是初学者,所以也许我做了一些不必要的事情。
解决方案是使用dispatchGesture方法。
首先,您创建一个目录(我称之为 xml)和一个像 config_accessibility_service.xml 这样的文件并添加:
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canPerformGestures="true"
android:description="@string/accessibility_service_description"/>
并使用 BIND_ACCESSIBILITY_SERVICE 权限修改 AndroidManifest.xml:
<service
android:name=".AutoClickService"
android:enabled="true"
android:label="@string/accessibility_service_name"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="@string/accessibility_service_name">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/config_accessibility_service"/>
</service>
我的 AutoClickService 类:
public class AutoClickService extends AccessibilityService {
@Override
public void onCreate() {
super.onCreate();
}
//apparently this method is called every time a event occurs
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
System.out.println("access event");
//autoClick(2000, 100, 950, 581);
}
@Override
public void onServiceConnected() {
super.onServiceConnected();
autoClick(2000, 100, 950, 581);
}
@Override
public void onInterrupt() {
}
public void autoClick(int startTimeMs, int durationMs, int x, int y) {
boolean isCalled = dispatchGesture(gestureDescription(startTimeMs, durationMs, x, y), null, null);
System.out.println(isCalled);
}
public GestureDescription gestureDescription(int startTimeMs, int durationMs, int x, int y) {
Path path = new Path();
path.moveTo(x, y);
return createGestureDescription(new GestureDescription.StrokeDescription(path, startTimeMs, durationMs));
}
public GestureDescription createGestureDescription(GestureDescription.StrokeDescription... strokes) {
GestureDescription.Builder builder = new GestureDescription.Builder();
for (GestureDescription.StrokeDescription stroke : strokes) {
builder.addStroke(stroke);
}
return builder.build();
}
}
最后,您可以验证用户权限并在 MainActivity 中运行该服务:
public void checkAccessibilityServicePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int access = 0;
try{
access = Settings.Secure.getInt(this.getContentResolver(), android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e){
e.printStackTrace();
//put a Toast
}
if (access == 0) {
Intent myIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(myIntent);
}
}
}
推荐阅读
- elasticsearch - 静态数据加密时 ElasticSearch 的工作原理
- python - 派格莱特。宽图像问题。8192/8193像素
- angular - Angular 6/RxJS 如何使用 takeUntil() 和路由参数取消订阅
- typescript - 使用带有包装对象检查的联合类型
- android - 在本机反应中处理音频文件意图
- ibm-cloud - Watson OpenScale 是否支持回归模型的偏差检查?
- python - 表查找循环的矢量化实现已解决
- python - 我有一个涉及随着循环改变变量的问题,可以这样做吗?
- python - 编码错误创建和写入.h文件
- javascript - 有没有办法使用 display:none 来动画内容过滤?