为Accessibility Service动态更改serviceInfo包

时间:2016-04-16 18:13:34

标签: android android-service accessibilityservice

我正在开发一款可以启动其他应用的应用。目前我正在使用带有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以更改包名称。

如果无障碍服务不是解决此问题的方法,请提供服务等替代方案。

2 个答案:

答案 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);
        }

这在我的测试中有效。