2016-04-22 12 views
2

Ich schreibe einen Accessibility-Dienst in Android, die auf die Ansicht der aktuell ausgewählten Ansicht abrufen, aber auf einigen Geräten (Nexus 6P 6.0.1, Samsung Galaxy S6 Rand + 5 + 6.0.1) Ich bekomme keine Sicht-ID durch und auf anderen (HTC One M8 5.0.1) kommt es gut durch. Da es auf einigen Geräten funktioniert, bin ich mir sicher, dass es keinen Problem mit meinem Code gibt, jedoch habe ich unten einen minimalen Testfall veröffentlicht.AccessibilityService nicht zurück Sicht IDs

Kann mir jemand helfen, meine Serviceberichte über alle Geräte zu erhalten?

Der A11y Service

public class ViewIdLoggingAccessibilityService extends AccessibilityService { 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     AccessibilityNodeInfo source = event.getSource(); 
     if (source == null) { 
      Log.d("onAccessibilityEvent", "source was null for: " + event); 
     } else { 
      String viewIdResourceName = source.getViewIdResourceName(); 
      Log.d("onAccessibilityEvent", "viewid: " + viewIdResourceName); 
     } 
    } 

    @Override 
    public void onInterrupt() { 
     Log.d("!# onInterrupt", "called"); 
    } 
} 

Die AndroidManifest.xml

<manifest package="com.example.a11yservice" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
    > 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     > 

    <service 
     android:name=".ViewIdLoggingAccessibilityService" 
     android:label="@string/view_id_logging_service_label" 
     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/serviceconfig" 
      /> 
    </service> 

    </application> 

</manifest> 

serviceconfig.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused" 
    android:accessibilityFeedbackType="feedbackGeneric" 
    android:accessibilityFlags="flagReportViewIds" 
    android:canRetrieveWindowContent="true" 
    android:notificationTimeout="100" /> 

Antwort

3

Es Problem ist bekannt und wurde vor einiger Zeit zu AOSP issue tracker geschrieben. Sie können den Status des Problems hier überprüfen: "Accessibility Issue: flagReportViewIds has no effect on real devices in Android M".

Leider existiert das Problem sogar auf dem neuesten Android 7.0, aber ich fand einfache Abhilfe. Sie können Methode auf AccessibilityNodeInfo Objekt aufrufen, um es zu aktualisieren und alle verpassten Daten einschließlich ID zu sammeln.

So etwas:

public void onAccessibilityEvent(AccessibilityEvent event) { 
    AccessibilityNodeInfo ani = event.getSource(); 
    if (ani != null) { 
     ani.refresh(); // to fix issue with viewIdResName = null on Android 6+ 
    } 
} 
+0

perfekte Antwort! –

+0

Gibt es eine Möglichkeit, den Namen ** Aktivität ** von der Ereignisquelle zu erhalten? Ich möchte einen Empfänger zu dieser Aktivität senden, Ist es möglich? lass es mich wissen, bitte –

1

ich gefunden, wenn die viewId nicht verfügbar ist, das fokussierte Element abfragt scheint zu arbeiten:

AccessibilityNodeInfo source = findFocus(AccessibilityNodeInfo.FOCUS_INPUT); 
    viewIdResourceName = source.getViewIdResourceName(); 

gibt die korrekte Ansicht ID

Verwandte Themen