2017-05-18 2 views
0

Ich versuche, den AccessibilityService mit Android O zu verwenden, aber er erstellt diesen Dienst nicht.Android O: AccessibilityService

Manifest:

<service 
     android:name=".AccessService" 
     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/accessibility_service_config" /> 
    </service> 

XML-Konfiguration:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
        android:description="@string/app_name" 
        android:accessibilityEventTypes="typeAllMask" 
        android:accessibilityFlags="flagRequestFilterKeyEvents|flagIncludeNotImportantViews" 
        android:accessibilityFeedbackType="feedbackAllMask" 
        android:notificationTimeout="100" 
        android:canRetrieveWindowContent="true" 
        android:canRequestFilterKeyEvents="true" 
        android:settingsActivity="com.example.test.MainActivity" 
/> 

Ich habe Protokollausgabe für alle Methoden meiner erweiterten AccessibilityService Klasse, sondern auch die onCreate wurde nie genannt. Ich kann den Dienst in den Android Einstellungen aktivieren und binde ihn an die beiden Lautstärketasten. Wenn ich beide gleichzeitig drücke, sagt er immer, dass dies jetzt aktiviert ist. Es heißt nicht deaktiviert oder so ähnlich. Die Seite mit den Android-Einstellungen zeigt an, dass sie aktiv ist.

Meine AccessibilityService-Klasse hat nur Log-Ausgabe. Ich habe in dieser Klasse nichts anderes gemacht.

Verpasse ich etwas? Gibt es noch etwas in Android O, was ich tun muss? Ich versuchte es basierend auf diesem Tutorial: https://developer.android.com/guide/topics/ui/accessibility/services.html

Ich möchte lange drücken Lautstärke Taste fangen.

Antwort

1

Es ist unklar, was Sie meinen, wenn Sie sagen, dass es den Dienst nicht erstellt, da Sie auch sagen, dass die Seite Android-Einstellungen es als aktiv erkennt.

Ich habe versucht, einen Accessibility-Service zu erstellen, um es auf Android O laufen zu lassen und es scheint zu funktionieren.

Hier ist mein Service, die, wie Sie Ihren Dienst verhält sich sagen, nur protokolliert:

public class LoggingA11yService extends AccessibilityService { 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     Log.d("!!!", "onAccessibilityEvent: " + event); 
    } 

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

} 

Es ist notwendig, diesen Dienst in dem Manifest, zu erklären und eine Konfiguration für sie in XML liefern (einige Eigenschaften konfigurierbar sind programmatisch, aber alle sind über XML konfigurierbar, so dies der bevorzugte Ansatz ist):

<application> 

    <service android:name=".LoggingA11yService" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" 
     android:label="@string/accessibility_service_label"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibilityservice" /> 
    </service> 

    <activity ... 

</application> 

@xml/accessibilityservice:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:accessibilityFlags="flagDefault" 
    android:canRetrieveWindowContent="true" 
    android:description="@string/accessibility_service_description" 
    android:notificationTimeout="100" /> 

Wenn Sie den Dienst einfach aktivieren, indem Sie zu Einstellungen> Erreichbarkeit> LoggingA11yService> wechseln, sollte er aktiviert werden.

Ich kann logcat der Ausgabe sehen in wie ich mein Gerät zB verwenden:

05-21 10:34:25.848 15998-15998/com.novoda.androidskeleton D/!!!: 
onAccessibilityEvent: EventType: TYPE_WINDOW_STATE_CHANGED; 
EventTime: 113655863; PackageName: com.android.settings; 
MovementGranularity: 0; Action: 0 [ ClassName: com.android.settings.SubSettings; 
Text: [Label Logging A11y Service]; ContentDescription: null; 
ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; 
IsPassword: false; IsChecked: false; IsFullScreen: true; 
Scrollable: false; BeforeText: null; FromIndex: -1; ToIndex: -1; 
ScrollX: -1; ScrollY: -1; MaxScrollX: -1; MaxScrollY: -1; 
AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; 
recordCount: 0 

Beachten Sie die docs sagen, dass, wenn mehrere Dienste, die das gleiche Ereignis verarbeiten kann, dann werden sie nur das Ereignis senden alle Dienste, wenn die Dienste verschiedene Arten von Feedback bereitstellen. Andernfalls wird der erste Dienst, der registriert wurde, das Ereignis erhalten. Überprüfen Sie, ob dies nicht der Fall ist, indem Sie einen anderen Dienst für Eingabehilfen deaktivieren, während Sie Ihren testen.

0

Hm? Ich war mir sicher, bereits eine Antwort geschrieben zu haben. Vielleicht in der falschen Frage? Whoops ..

Wenn ich sage, dass es nicht beginnt, meine ich, es geht in keiner Methode. Kein Logout, nichts. Aber: Es scheint, dass es ein Fehler in der letzten Android O Developer Preview war. Einen Tag später gab es ein weiteres OTA Update und danach ging es gut.

Leider sieht es so aus, dass dies nicht aufgerufen wird, wenn das Display ausgeschaltet ist. Ich brauche es auch mit deaktivierter Anzeige.

Verwandte Themen