webentwicklung-frage-antwort-db.com.de

Warum funktioniert dieser NotificationListenerService nicht?

Ich kämpfe ohne viel Glück gegen den NotificationListenerService. Ich habe viele Rezepte ausprobiert, die hier und da zu finden sind, besonders auf so ... Aber es funktioniert ziemlich inkonsistent.

Ein erster Blick auf den Code:

Manifest:

<service
    Android:name=".services.NLService"
    Android:permission="Android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
    <intent-filter>
        <action Android:name="Android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

Dann der Service selbst:

public class NLService extends NotificationListenerService {

    private String TAG = "NLService";

    // bind and unbind seems to make it work with Android 6...
    // but is never called with Android 4.4... 
    @Override
    public IBinder onBind(Intent mIntent) {
        IBinder mIBinder = super.onBind(mIntent);
        Log.i(TAG, "onBind");
        return mIBinder;
    }

    @Override
    public boolean onUnbind(Intent mIntent) {
        boolean mOnUnbind = super.onUnbind(mIntent);
        Log.i(TAG, "onUnbind");
        isNotificationAccessEnabled = false;
        try {
        } catch (Exception e) {
            Log.e(TAG, "Error during unbind", e);
        }
        return mOnUnbind;
    }

    // onCreate is called with Android 4.4 
    // because the service is explicitly started from the MainActivity.
    // Not on Android 6 where the system binds this service itself...

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "**********  onCreate");

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        Log.i(TAG, "**********  onNotificationPosted");
        Log.i(TAG, "ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName());
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i(TAG, "********** onNOtificationRemoved");
        Log.i(TAG, "ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName());
    }
}

In der Hauptaktivität wird der Dienst gestartet oder der Benutzer wird gebeten, die Einstellung bei Bedarf zu aktivieren:

if (!Utilities.hasNotificationAccess(this)) 
{
     Intent intent = new Intent("Android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
     startActivity(intent);
     Log.i(TAG,"hasNotificationAccess NO");
}
else
{
    Log.i(TAG,"hasNotificationAccess YES");

    // without this startService, it never works with Android 4.4...
    // but this is not needed in Android 6... 
    Intent mServiceIntent = new Intent(this, NLService.class);
    startService(mServiceIntent);
}

Offensichtlich ist der sichere Einstellungszugriff für Benachrichtigungen aktiviert ...

Auf Android 6:

Auf dem NLService selbst funktioniert es durch Hinzufügen der Methoden onBind und onUnbind. Ich kann das onBind-Protokoll sehen, und die Funktion onNotificationPosted wird ordnungsgemäß ausgelöst. Aber es dauert bis zum nächsten Start der App, dann nicht mehr bindend, nicht mehr onNotificationPosted, nur nichts passiert, bis ich zu den Sicherheitseinstellungen zurückkehre, um den Benachrichtigungszugriff zu deaktivieren - dies wird bei jedem Start der App wiederholt ist in einer Produktionsumgebung nicht möglich.

Auf Android 4.4:

Im Gegensatz zu Android 6 muss ich in der MainActivity den NLService explizit starten, da er sonst nie von alleine startet. Aber es funktioniert wieder beim ersten Start und nie wieder, bis die Sicherheitseinstellung deaktiviert wird.

Habe ich etwas Offensichtliches verpasst?

12
JBA

Beim Zwischenspeichern von Android ist ein Problem aufgetreten. Wenn Sie eine App auf das Gerät hochladen, verbindet das Betriebssystem Ihren Dienst mit Notification Manager. Wenn Sie Ihre App zuvor ausgeführt haben, findet Android diesen Dienst im Cache, sodass keine erneute Verbindung hergestellt wird.

Problemumgehung: Benennen Sie Ihren Dienst um, bevor Sie die App auf Ihr Gerät übertragen (Refactor-Option in Android Studio funktioniert einwandfrei). Android erkennt diesen Dienst als neuen und stellt eine Verbindung mit Notification Manager her.

https://developer.Android.com/reference/Android/service/notification/NotificationListenerService.html#onListenerConnected () - Diese Methode wird nach dem Herstellen einer Verbindung mit Notification Manager aufgerufen, damit Sie überprüfen können, ob Ihr Dienst verbunden ist oder nicht.

20
Konrad Sikorski

Das Problem besteht immer noch in Oreo! Das Umgestalten des Serviceklassennamens funktioniert wie von Konrad geschrieben. Vielen Dank Konrad!

Leider habe ich sehr lange gebraucht, um Ihren Beitrag zu finden. AFAIK: Android muss dies zu seiner Dokumentation hinzufügen, um dieses Problem zu umgehen, bis es behoben ist.

1
PaulF