2012-09-23 4 views
13

Ich versuche, meine App erkennen zu lassen, wenn eine Benachrichtigung angezeigt wird. Ich habe es in den Einstellungen App aktiviert und onServiceConnected wird aufgerufen, aber wenn ich eine Benachrichtigung erstellen oder eine E-Mail über die Google Mail App erhalten passiert nichts, onAccessibilityEvent wird nicht aufgerufen.Android Accessibility Service erkennt Benachrichtigungen

Android Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.test.slide" 
android:versionCode="1" 
android:versionName="1.0"> 
<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="15"/> 
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
<uses-permission android:name="android.permission.GET_TASKS"/> 
<application android:label="Slide" 
    android:icon="@drawable/ic_launcher" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".Settings" 
     android:label="Slide"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".Tools" 
     android:label="Slide" 
     android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
    </activity> 
    <service android:name=".LocalService"/> 
    <service android:name=".NotificationService" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" 
     android:label="Slide" 
     android:enabled="true" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService"/> 
     </intent-filter> 
    </service> 
</application> 

NotificationService.java

package com.test.slide; 

import android.accessibilityservice.AccessibilityService; 
import android.accessibilityservice.AccessibilityServiceInfo; 
import android.view.accessibility.AccessibilityEvent; 

public class NotificationService extends AccessibilityService { 
@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    System.out.println("onAccessibilityEvent"); 
    if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { 
     System.out.println("notification: " + event.getText()); 
    } 
} 
@Override 
protected void onServiceConnected() { 
    System.out.println("onServiceConnected"); 
    AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; 
    info.notificationTimeout = 100; 
    info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK; 
    setServiceInfo(info); 
} 

@Override 
public void onInterrupt() { 
    System.out.println("onInterrupt"); 
} 
} 

Vielen Dank für jede Hilfe.

+0

Haben Sie die Lösung gefunden? Ich habe genau das gleiche Problem. –

+0

alanvs Antwort hat bei mir funktioniert – ng93

+0

Für welche Systemversion programmieren Sie? ICS? Geleebohne? –

Antwort

21

Eingabehilfen in Android 4.0 und höher können sich merkwürdig verhalten, wenn im Manifest kein accessibility-service Meta-Tag definiert ist. Versuchen Sie, die Metadaten wie in den folgenden Beispielen zu definieren. Sie sollten weiterhin setServiceInfo() verwenden, um die Abwärtskompatibilität mit Geräten vor Version 4.0 aufrechtzuerhalten.

Außerdem würde ich empfehlen, einen Feedback-Typ anzugeben, der für Ihren Service spezifisch ist, anstatt "alle" zu verwenden.

AndroidManifest.xml

<service 
     . . . 
     android:name=".NotificationService" 
     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> 

res/xml/accessibilityservice.xml

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accessibilityEventTypes="typeNotificationStateChanged" 
    android:accessibilityFeedbackType="feedbackAllMask" 
    android:notificationTimeout="100" /> 

Es gab einen Fehler in Ihrem feedbackType. Korrigiert unten. Erwägen Sie dennoch, einen spezifischeren Feedback-Typ zu verwenden.

NotificationService.java

@Override 
protected void onServiceConnected() { 
    AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; 
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK; 
    info.notificationTimeout = 100; 
    setServiceInfo(info); 
} 
+0

Jetzt definieren Sie die 'serviceInfo' in XML und Code. Sie können den Codeteil von AccessibilityServiceInfo auslassen, da das XML im Manifest definiert ist. –

+3

Im Gegenteil, Sie müssen es an beiden Orten für die Kompatibilität mit Pre-ICS-Geräten definieren. – alanv

+0

danke! Vielen Dank! Vielen Dank! – Antonio

4

Die App AccessibilityService eine Genehmigung von Einstellungen> Bedienungshilfen haben, um benötigt, um die Systemereignisse zuzugreifen. Erlauben Sie die Erlaubnis von den Einstellungen. Dies kann dieses

Prüfung arbeiten Link

accessibility service is not started

+0

danke ich habe alles versucht, aber ich muss es von den Einstellungen aus aktivieren –