Skip to content Skip to sidebar Skip to footer

Call A Notification Listener Inside A Background Service In Android Studio

I have a background service running and a notification listener. I want to call the notification listener from the background service and it does not seem to work. I have below my

Solution 1:

So what I did wrong is that I tried to create 2 services. Instead I only needed one. Here is the code that works. What it simply does is starting the bacgrkound service and counts the notifications.When you click report it shows all the notifications, even if the user has close the app. I have put extra code for making a notification after 5 notifications.

MainActivity.java
package com.example.notifyservice;

import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;


publicclassMainActivityextendsAppCompatActivity {

/*
    protected final Timer myTimer = new Timer("MainActivityTimer", false);
*/@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        // FIRST OF ALL// START SERVICE AS STICKY - BY EXPLICIT INTENT// to prevent being started by the system (without the sticky flag)Intentintent=newIntent(getApplicationContext(), NLService.class);

        // TODO: to be removed
        intent.putExtra("id", 101);
        intent.putExtra("msg", "hi");

        //starting service


        startService(intent);


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intenti=newIntent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
        startActivity(i);
        //setting button click
        findViewById(R.id.btn_start_service).setOnClickListener(newView.OnClickListener() {
            @OverridepublicvoidonClick(View v) {

                // Ask service (async) for its status (manually after the main activity was paused or closed and missed some NLService's broadcasts)// the background service is sticky and the counters(added/removed) are not reset.//Creating an intent for sending to service//Intent intent = new Intent(getApplicationContext(), MyService.class);Intentintent=newIntent(getApplicationContext(), NLService.class);
                intent.putExtra("command", "get_status");
                //starting service
                startService(intent);

            }
        });
    }

    @OverrideprotectedvoidonStart() {
        super.onStart();

        // register broadcast receiver for the intent MyTaskStatus
        LocalBroadcastManager.getInstance(this).registerReceiver(MyReceiver, newIntentFilter(NLService.ACTION_STATUS_BROADCAST));


    }


    //Defining broadcast receiverprivateBroadcastReceiverMyReceiver=newBroadcastReceiver() {
        @OverridepublicvoidonReceive(Context context, Intent intent) {
            Log.i("MainActivity", "Broadcast Recieved: "+intent.getStringExtra("serviceMessage"));
            Stringmessage= intent.getStringExtra("serviceMessage");
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
        }
    };




    @OverrideprotectedvoidonStop() {
        super.onStop();

        LocalBroadcastManager.getInstance(this).unregisterReceiver(MyReceiver);
    }

}

NLService.java

package com.example.notifyservice;

import android.app.IntentService;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

// @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)publicclassNLServiceextendsNotificationListenerService {

    publicstaticfinalStringACTION_STATUS_BROADCAST="com.example.notifyservice.NLService_Status";

    privateStringTAG=this.getClass().getSimpleName();
    private NLServiceReceiver nlservicereciver;

    /**
     * The number of notifications added (since the service started)
     */privateint nAdded=0;
    /**
     * The number of notifications removed (since the service started)
     */privateint nRemoved=0;
    inttemp=5;

    @OverridepublicintonStartCommand(Intent intent, int flags, int startId) {
        //retrieving data from the received intentif(intent.hasExtra("command")) {
            Log.i("NLService", "Started for command '"+intent.getStringExtra("command"));
            broadcastStatus();
        } elseif(intent.hasExtra("id")) {
            intid= intent.getIntExtra("id", 0);
            Stringmessage= intent.getStringExtra("msg");
            Log.i("NLService", "Requested to start explicitly - id : " + id + " message : " + message);
        }
        super.onStartCommand(intent, flags, startId);

        // NOTE: We return STICKY to prevent the automatic service terminationreturn START_STICKY;
    }

    privatevoidbroadcastStatus() {
        Log.i("NLService", "Broadcasting status added("+nAdded+")/removed("+nRemoved+")");
        Intenti1=newIntent(ACTION_STATUS_BROADCAST);
        i1.putExtra("serviceMessage","Added: "+nAdded+" | Removed: "+nRemoved);
        LocalBroadcastManager.getInstance(this).sendBroadcast(i1);
        // sendBroadcast(i1);

    }

    @OverridepublicvoidonCreate() {
        super.onCreate();
        Log.i("NLService", "NLService created!");
        nlservicereciver = newNLServiceReceiver();
        IntentFilterfilter=newIntentFilter();
        filter.addAction("com.example.notifyservice.NOTIFICATION_LISTENER_SERVICE_EXAMPLE");
        registerReceiver(nlservicereciver,filter);
        Log.i("NLService", "NLService created!");
    }

    @OverridepublicvoidonDestroy() {
        super.onDestroy();
        unregisterReceiver(nlservicereciver);
        Log.i("NLService", "NLService destroyed!");
    }

    /* > API 21
    @Override
    public void onListenerDisconnected() {
        super.onListenerDisconnected();
        Log.w("NLService", "Notification listener DISCONNECTED from the notification service! Scheduling a reconnect...");
        // requestRebind(new ComponentName(this.getPackageName(), this.getClass().getCanonicalName()));
    }

    @Override
    public void onListenerConnected() {
        super.onListenerConnected();
        Log.w("NLService", "Notification listener connected with the notification service!");
    }
    */@OverridepublicvoidonNotificationPosted(StatusBarNotification sbn) {

        Log.i(TAG,"**********  onNotificationPosted");
        Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName());
        Intenti=newIntent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE");
        i.putExtra("notification_event","onNotificationPosted :" + sbn.getPackageName() + "\n");
        sendBroadcast(i);

        nAdded++;

        if (nAdded == temp) {
            System.out.println("reached" + temp);
            temp = temp + 5;
            System.out.println(temp);
            NotificationManagernManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            NotificationCompat.Builderncomp=newNotificationCompat.Builder(this);
            ncomp.setContentTitle("Notification");
            ncomp.setContentText("Notification Listener Service Example");
            ncomp.setTicker("Notification Listener Service Example");
            ncomp.setSmallIcon(R.mipmap.ic_launcher);
            ncomp.setAutoCancel(true);
            nManager.notify((int)System.currentTimeMillis(),ncomp.build());
        }
        broadcastStatus();
    }

    @OverridepublicvoidonNotificationRemoved(StatusBarNotification sbn) {
        Log.i(TAG,"********** onNOtificationRemoved");
        Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText +"\t" + sbn.getPackageName());
        Intenti=newIntent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE");
        i.putExtra("notification_event","onNotificationRemoved :" + sbn.getPackageName() + "\n");

        sendBroadcast(i);

        nRemoved++;
        broadcastStatus();
    }

    classNLServiceReceiverextendsBroadcastReceiver {

        @OverridepublicvoidonReceive(Context context, Intent intent) {

            if(intent.getStringExtra("command").equals("list")){
                Intenti1=newIntent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE");
                i1.putExtra("notification_event","=====================");
                sendBroadcast(i1);
                int i=1;
                for (StatusBarNotification sbn : NLService.this.getActiveNotifications()) {
                    Intenti2=newIntent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE");
                    i2.putExtra("notification_event",i +" " + sbn.getPackageName() + "\n");
                    sendBroadcast(i2);
                    i++;
                }
                Intenti3=newIntent("com.example.notify.NOTIFICATION_LISTENER_EXAMPLE");
                i3.putExtra("notification_event","===== Notification List ====");
                sendBroadcast(i3);

            }

        }
    }

}

Solution 2:

Did you defined your services in your manifest. For notification service you need to write permission also.

<serviceandroid:name=".MyService"android:enabled="true"/><serviceandroid:name=".NLService"android:label="@string/app_name"android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"><intent-filter><actionandroid:name="android.service.notification.NotificationListenerService" /></intent-filter></service>

if you want to show notification in that case you need to write this code also:

NotificationManagernManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            NotificationCompat.Builderncomp=newNotificationCompat.Builder(this);
            ncomp.setContentTitle("My Notification");
            ncomp.setContentText("Notification Listener Service Example");
            ncomp.setTicker("Notification Listener Service Example");
            ncomp.setSmallIcon(R.mipmap.ic_launcher);
            ncomp.setAutoCancel(true);
            nManager.notify((int)System.currentTimeMillis(),ncomp.build());

or did you provide the notification access to your app? Go to your settings and check notification access to your app provided or not?

enter image description here

Post a Comment for "Call A Notification Listener Inside A Background Service In Android Studio"