2012-09-23 15 views
13

Estoy tratando de hacer que mi aplicación detecte cada vez que se muestra una notificación. Lo he habilitado en la aplicación de configuración y se llama al onServiceConnected, sin embargo, cuando creo una notificación o recibo un correo electrónico a través de la aplicación de Gmail no ocurre nada, onAccessibilityEvent no se llama.Servicio de accesibilidad de Android detectar notificación

manifiesto de Android:

<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"); 
} 
} 

Gracias por cualquier ayuda.

+0

¿Has encontrado la solución? Tengo exactamente el mismo problema. –

+0

La respuesta de alanv funcionó para mí – ng93

+0

¿Para qué versión de sistema está programando? ICS? ¿frijol de jalea? –

Respuesta

21

Los servicios de accesibilidad en Android 4.0 y superior pueden tener un comportamiento extraño si no existe una etiqueta de metadatos accessibility-service definida en el manifiesto. Intente definir los metadatos como en los ejemplos a continuación. Debería seguir utilizando setServiceInfo() para mantener la compatibilidad con dispositivos anteriores a 4.0.

Además, recomendaría especificar un tipo de comentarios que sea específico para su servicio, en lugar de usar "todo".

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" /> 

Se ha producido un error en su feedbackType. Corregido a continuación. Aún así, considere usar un tipo de comentarios más específico.

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

Ahora está definiendo 'serviceInfo' en XML y código. Puede omitir la parte de código de AccessibilityServiceInfo porque el xml se define en el manifiesto. –

+3

Por el contrario, debe definirlo en ambos lugares para la compatibilidad con dispositivos pre-ICS. – alanv

+0

gracias! ¡Gracias! ¡Gracias! – Antonio

4

La aplicación utilizando AccessibilityService necesaria para tener un permiso de Configuración> Accesibilidad con el fin de acceder a los eventos del sistema. Permitir permiso desde la configuración. Esto puede funcionar

verificación de este enlace

accessibility service is not started

+0

gracias probé todo, pero tengo que habilitarlo desde la configuración –

Cuestiones relacionadas