2012-09-23 105 views
13

我試圖讓我的應用在顯示通知時進行檢測。我已經在設置應用程序中啓用它,並且onServiceConnected確實被調用,但是當我通過Gmail應用程序創建通知或接收電子郵件時,什麼也沒有發生,onAccessibilityEvent不會被調用。Android無障礙服務檢測通知

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

感謝您的幫助。

+0

您是否找到了解決辦法?我也有完全一樣的問題。 –

+0

alanv的答案對我有用 – ng93

+0

對於什麼系統版本你編程? ICS?果凍豆? –

回答

21

如果在清單中沒有定義元數據標記,則Android 4.0及更高版本中的輔助功能服務可能會表現異常。嘗試按照下面的示例定義元數據。您應該繼續使用setServiceInfo()以保持與4.0之前的設備的向後兼容性。

此外,我會建議指定一個特定於您的服務的反饋類型,而不是使用「全部」。

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

有你feedbackType錯誤。更正如下。不過,請考慮使用更具體的反饋類型。

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

現在您正在使用XML和代碼定義'serviceInfo'。您可以省略AccessibilityServiceInfo的代碼部分,因爲xml是在清單中定義的。 –

+3

相反,您必須在兩個地方將其定義爲與ICS之前的設備兼容。 – alanv

+0

謝謝!謝謝!謝謝! – Antonio

4

使用AccessibilityService需要有從設置>輔助功能權限才能訪問系統中的事件的應用程序。 允許來自設置的權限。這可能工作

檢查此鏈接

accessibility service is not started

+0

謝謝我試過每一件事,但我必須從設置中啓用它 –