我正在开发一款可以启动其他应用的应用。目前我正在使用带有setServiceInfo的AccessibilityService来监听窗口更改,以获取特定的包名称,但我无法动态更改这些包名称。
private void setServiceInfo(String apps[]) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 0;
info.packageNames = apps;
setServiceInfo(info);
}
以上代码是我设置serviceInfo的方式。我调用setServiceInfo onServiceConnected以首先初始化和onAccessibilityEvents以更改包名称。
如果无障碍服务不是解决此问题的方法,请提供服务等替代方案。
答案 0 :(得分:0)
所以我不得不解决我的问题。我没有通过调用setServiceInfo设置包名并更改包的值,而是设置了info.packageNames = null。
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 0;
info.packageNames = null;
setServiceInfo(info);
这样就触发了所有包的onAccessiblityEvent,但是我通过比较调用事件的包和我需要使用的特定包event.getPackageName().toString();
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
final int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
package = event.getPackageName().toString();
Toast.makeText(this, "Came to window state changed", Toast.LENGTH_SHORT).show();
if (whateverpackage.contains(newApp)) {
//Then do something
}
只需用您需要的包名替换任何包。
答案 1 :(得分:0)
通过AccessibilityServiceInfo
(在API 16中添加)重用现有的getServiceInfo()
对象,而不是创建新对象:
@Override
protected void onServiceConnected() {
super.onServiceConnected();
AccessibilityServiceInfo info = getServiceInfo();
// your other assignments
info.packageNames = apps;
setServiceInfo(info);
}
这在我的测试中有效。