2012-09-23 10 views
13

Próbuję sprawić, aby moja aplikacja wykryła, kiedy wyświetlane jest powiadomienie. Włączyłem tę funkcję w ustawieniach aplikacji i zadzwoniłam pod numer onServiceConnected, ale gdy utworzę powiadomienie lub otrzymam wiadomość e-mail przez aplikację Gmaila nic się nie dzieje, onAccessibilityEvent nie zostaje wywołana.Usługa wykrywania dostępności Androida wykrywa powiadomienie

Android oczywisty:

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

Dzięki za wszelką pomoc.

+0

Czy znalazłeś rozwiązanie? Mam dokładnie ten sam problem. –

+0

Odpowiedź alanv zadziałała dla mnie – ng93

+0

Dla jakiej wersji systemu programujesz? ICS? żelki? –

Odpowiedz

21

Usługi dostępności w systemie Android w wersji 4.0 i nowszych mogą się dziwnie zachowywać, jeśli w manifeście nie ma znacznika meta-danych accessibility-service. Spróbuj zdefiniować metadane, tak jak w przykładach poniżej. Powinieneś nadal używać metody setServiceInfo(), aby zachować kompatybilność wsteczną z urządzeniami starszymi niż 4.0.

Polecam również określenie typu opinii, który jest specyficzny dla Twojej usługi, zamiast używania "wszystkich".

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

wystąpił błąd w feedbackType. Poprawione poniżej. Zastanów się jednak nad użyciem bardziej konkretnego typu opinii.

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

Teraz definiujesz 'serviceInfo' w XML i kodzie. Możesz pominąć część kodu AccessibilityServiceInfo, ponieważ xml jest zdefiniowany w manifeście. –

+3

Wręcz przeciwnie, należy zdefiniować go w obu miejscach w celu zapewnienia zgodności z urządzeniami pre-ICS. – alanv

+0

dzięki! dzięki! dzięki! – Antonio

4

Aplikacja za pomocą AccessibilityService musiał mieć pozwolenie od Ustawienia> Ułatwienia dostępu w celu uzyskania dostępu do zdarzeń systemowych. Zezwalaj na uprawnienia z ustawień. To może działać

Sprawdź ten link

accessibility service is not started

+0

, dzięki, że wypróbowałem każdą rzecz, ale muszę ją włączyć z ustawień –

Powiązane problemy