Android accessibility service detect notification
Asked Answered
B

2

14

I'm trying to make my app detect whenever a notification is displayed. I've enabled it in the settings app and onServiceConnected does get called, however when I create a notification or receive an e-mail through the gmail app nothing happens, onAccessibilityEvent does not get called.

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

Thanks for any help.

Barahona answered 23/9, 2012 at 17:18 Comment(2)
Did you found the solution? i have exactly the same problem.Roundsman
For what system version are you programming? ICS? jelly bean?Roundsman
O
22

Accessibility services in Android 4.0 and above can behave strangely if there is no accessibility-service meta-data tag defined in the manifest. Try defining the meta-data as in the examples below. You should continue to use setServiceInfo() to maintain backward compatibility with pre-4.0 devices.

Also, I would recommend specifying a feedback type that is specific to your service, rather than using "all".

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

There was an error in your feedbackType. Corrected below. Still, consider using a more specific feedback type.

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);
}
Osmic answered 24/9, 2012 at 1:33 Comment(4)
Now you are defining the serviceInfo in XML and code. You may leave out the code part of AccessibilityServiceInfo because the xml is defined in the manifest.Roundsman
On the contrary, you must define it in both places for compatibility with pre-ICS devices.Osmic
@Osmic I've done all what you said, still onServiceConnected() is not getting called, and o course performGlobalAction returns false, what should I consider more? knowing that I enabled my service under mobile settings -> AccesibilityCraggie
@Astrount.. could you find the reason for your problem? Even for me, onServiceConnected is not called though I am doing everythingElectronegative
U
4

The app using AccessibilityService needed to have a permission from settings>Accessibility in order to access the system events. Allow permission from settings . This may work

check this link

accessibility service is not started

Underslung answered 12/11, 2012 at 6:26 Comment(1)
thanks i tried every thing but i have to enable it from settingsSolo

© 2022 - 2024 — McMap. All rights reserved.