Android AccessibilityService 中的 onAccessibilityEvent 未被调用
Android onAccessibilityEvent in AccessibilityService not getting called
我尝试开发一个非常简单的场景,在该场景中,当事件发生时我只会收到一条小消息。不幸的是,我无法找出为什么下面的代码没有打开吐司消息。我知道已经有一些关于这个主题的帖子我都读过了,其中 none 对我有所帮助。如果有人能帮助我或提供一个工作示例,我将不胜感激。
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.testing.attack">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service android:name=".MaliciousService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="A malicious service">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
</service>
</application>
</manifest>
服务
package com.example.android.testing.attack;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;
public class MaliciousService extends AccessibilityService {
@Override
public void onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.notificationTimeout = 100;
this.setServiceInfo(info);
Toast t = Toast.makeText(getApplicationContext(), "Malicious Accessibility Service is connected now", Toast.LENGTH_SHORT);
t.show();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Toast t = Toast.makeText(getApplicationContext(), "An event occurred", Toast.LENGTH_SHORT);
t.show();
}
@Override
public void onInterrupt() {
Toast t = Toast.makeText(getApplicationContext(), "An interrupt occurred", Toast.LENGTH_SHORT);
t.show();
}
}
我在设置中打开该服务,我得到了初始的 Toast,上面写着 "Malicious Service is connected now"。但是每当我滑动或打开新的 activity 或其他东西时,我都不会得到任何其他 Toast。
你必须在主线程上显示吐司。如果您只是为了调试而使用 toast,请使用 Log。
或
请阅读本文
Android Service to show toast
根据 Raj 的评论,我制定了以下解决方案:
@Override
public void onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.notificationTimeout = 100;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
this.setServiceInfo(info);
Toast t = Toast.makeText(getApplicationContext(), "Malicious Accessibility Service is connected now", Toast.LENGTH_SHORT);
t.show();
}
我所要做的就是添加 FEEDBACK_ALL_MASK
配置。不幸的是,我在文档中找不到任何确切的细节,这个配置到底控制了什么。
我尝试开发一个非常简单的场景,在该场景中,当事件发生时我只会收到一条小消息。不幸的是,我无法找出为什么下面的代码没有打开吐司消息。我知道已经有一些关于这个主题的帖子我都读过了,其中 none 对我有所帮助。如果有人能帮助我或提供一个工作示例,我将不胜感激。
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.testing.attack">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service android:name=".MaliciousService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="A malicious service">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
</service>
</application>
</manifest>
服务
package com.example.android.testing.attack;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;
public class MaliciousService extends AccessibilityService {
@Override
public void onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.notificationTimeout = 100;
this.setServiceInfo(info);
Toast t = Toast.makeText(getApplicationContext(), "Malicious Accessibility Service is connected now", Toast.LENGTH_SHORT);
t.show();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Toast t = Toast.makeText(getApplicationContext(), "An event occurred", Toast.LENGTH_SHORT);
t.show();
}
@Override
public void onInterrupt() {
Toast t = Toast.makeText(getApplicationContext(), "An interrupt occurred", Toast.LENGTH_SHORT);
t.show();
}
}
我在设置中打开该服务,我得到了初始的 Toast,上面写着 "Malicious Service is connected now"。但是每当我滑动或打开新的 activity 或其他东西时,我都不会得到任何其他 Toast。
你必须在主线程上显示吐司。如果您只是为了调试而使用 toast,请使用 Log。
或
请阅读本文
Android Service to show toast
根据 Raj 的评论,我制定了以下解决方案:
@Override
public void onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.notificationTimeout = 100;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
this.setServiceInfo(info);
Toast t = Toast.makeText(getApplicationContext(), "Malicious Accessibility Service is connected now", Toast.LENGTH_SHORT);
t.show();
}
我所要做的就是添加 FEEDBACK_ALL_MASK
配置。不幸的是,我在文档中找不到任何确切的细节,这个配置到底控制了什么。