我已经使用android中的辅助功能服务来检测前台应用程序。
我想收听2个可用的可访问性事件
TYPE_VIEW_TEXT_CHANGED
TYPE_WINDOW_STATE_CHANGED
我想监听所有window state change
事件,这是有效的,但对于第二个事件,我只想监听1-2个应用程序的view_text_changed
事件,而不是全部。
我读过&尝试了xml中的android:packageNames
参数,但它会对window_state_changed事件施加限制。
还有别的办法吗??
不幸的是,没有办法为指定的可访问性事件指定有趣的包名称。您只需要使用AccessibilityEvent#getPackageName来筛选您感兴趣的包。
假设您已经将AndroidManifest
设置为识别AccessibilityService
,我将在此处添加其他必需的代码,以防有人想要直接回答。
辅助功能服务配置文件:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android= "http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:accessibilityEventTypes="typeWindowStateChanged|typeViewTextChanged"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>
请注意,android:accessibilityEventTypes
是根据需要提供的。如果将包限制在xml中,则不会得到问题中正确指出的TYPE_WINDOW_STATE_CHANGED
。
因此,您还需要对AccessibilityService
的实现进行更改。
public class VoiceAccessibilityService extends android.accessibilityservice.AccessibilityService {
private static String TAG = VoiceAccessibilityService.class.getName();
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED && event.getPackageName().equals("Your package names")) {
Logger.d(TAG + " SHOW " + event.toString());
}
}
@Override
public void onInterrupt() {
Logger.d(TAG + " interrupt");
}
}
希望它能有所帮助!