2016-03-03 288 views
1

我正在使用我的Android應用無障礙服務來讀取網絡運營商的彈出窗口。如果僅爲我的應用程序啓用輔助功能服務,它會正常工作。如果我爲某些其他Android應用開啓了它,onAccessibilityEvent()根本不起作用。如果其他應用的輔助功能服務處於開啓狀態,則Android無障礙服務無法正常工作

清單代碼:

<service 
    android:name=".services.NotificationAccessibilityService" 
    android:exported="false" 
    android:label="@string/app_name" 
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
    <intent-filter> 
     <action android:name="android.accessibilityservice.AccessibilityService" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.accessibilityservice" 
     android:resource="@xml/accessibilityservice" /> 
</service> 

輔助類:

public class NotificationAccessibilityService extends AccessibilityService { 


@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getClassName() != null && event.getClassName().toString().equalsIgnoreCase(
      "android.app.AlertDialog") && event.getPackageName() != null 
      && event.getPackageName().toString().equalsIgnoreCase("com.android.phone")) 
    { 
     Logger.d(TAG,"source info"+ " " + event.getClassName().toString()); 
     Logger.d(TAG, String.format("onAccessibilityEvent: [type] %s [class] %s [package] %s [time] %s [text] %s", 
       getEventType(event), event.getClassName(), event.getPackageName(), 
       event.getEventTime(), getEventText(event))); 
@Override 
public boolean bindService(Intent service, ServiceConnection conn, int flags) { 
    return super.bindService(service, conn, flags); 
} 

@Override 
public void onInterrupt() { 
} 

@Override 
public void onServiceConnected() 
{ 
     Intent iLaunch = new Intent(NotificationAccessibilityService.this, StatusAct.class); 
     iLaunch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(iLaunch); 
    AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 
    info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK; 
    setServiceInfo(info); 
} 

private String getEventType(AccessibilityEvent event) { 
    switch (event.getEventType()) { 
     case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: 
      return "TYPE_NOTIFICATION_STATE_CHANGED"; 
     case AccessibilityEvent.TYPE_VIEW_CLICKED: 
      return "TYPE_VIEW_CLICKED"; 
     case AccessibilityEvent.TYPE_VIEW_FOCUSED: 
      return "TYPE_VIEW_FOCUSED"; 
     case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: 
      return "TYPE_VIEW_LONG_CLICKED"; 
     case AccessibilityEvent.TYPE_VIEW_SELECTED: 
      return "TYPE_VIEW_SELECTED"; 
     case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: 
      return "TYPE_WINDOW_STATE_CHANGED"; 
     case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: 
      return "TYPE_VIEW_TEXT_CHANGED"; 
    } 
    return "default"; 
} 

private String getEventText(AccessibilityEvent event) { 
    StringBuilder sb = new StringBuilder(); 
    for (CharSequence s : event.getText()) { 
     sb.append(s); 
    } 
    return sb.toString(); 
} 
} 
+0

你能分享你的代碼嗎? –

+0

嗨Ben ..用代碼編輯了這個問題。請看看和幫助! –

回答

1

我有問題想你。然後我通過這個來定義AccessibilityService。它至少適用於我。你應該試試看。

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeWindowStateChanged" 
    android:accessibilityFeedbackType="feedbackGeneric" 
    android:accessibilityFlags="flagIncludeNotImportantViews" 
    android:canRetrieveWindowContent="false" 
    android:description="@string/accessibility_service_description" /> 
+1

是啊!將Feedbacktype更改爲feedbackGeneric作品:)謝謝:) –