Android permisson BIND_NOTIFICATION_LISTENER_SERVICE is not working

大兔子大兔子 提交于 2019-12-12 11:40:28

问题


I'm working in React Native Application. I'm trying hard in Android to make use of Notification Services & BIND_NOTIFICATION_LISTENER_SERVICE. I'm trying to read the incoming notifications using NotificationListenerService.

I'm using One Plus 5T (Android Oreo) for debugging.

I've seen lots of duplicate questions and I've tried the following solutions which I got from those questions.

1.Restarting the phone (Sounds silly and it doesn't work)

2.Re-install/Re-build the application

  1. Renaming the NotificationListenerService class file and run Etc..

Problems I've been facing,

1.Cannot see my application in 'Notification Access' settings.

2.onCreate / onNotificationPosted is not getting called when I receive any Notification

3.Checked whether my application is having Notification permisson or not using the below code and it returned 'false' (Obviously, that's my problem)

ComponentName cn = new ComponentName(getReactApplicationContext(), NotificationListener.class);
String flat = Settings.Secure.getString(getReactApplicationContext()
                   .getContentResolver(), "enabled_notification_listeners");
final boolean hasPermission = flat != null && flat.contains(cn.flattenToString());
// hasPermission - false

Since BIND_NOTIFICATION_LISTENER_SERVICE is not listed Dangerous permissions list, I thought defining it in Manifest (Source is given below for your reference) is enough instead of asking run time permission.

I've followed this tutorial and referred other tutorials also. I can't find out where I'm doing wrong. Everything looks perfect. After scratching my mind for the whole day, I thought I'd ask your help.

Find my source code below.

Your time and patience are appreciated. (:

My Source

AndroidManifest.xml

      <service
            android:name=".NotificationListener"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
      </service>

NotificationListener.java (Not even single log printed)

public class NotificationListener extends NotificationListenerService {

    Context context;

    private String TAG = this.getClass().getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("KBT", "FROM LISTENER onCreate");
        context = getApplicationContext();
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        Log.d("KBT", "FROM LISTENER onNotificationPosted");

        String pack = sbn.getPackageName();
        String ticker ="";
        if(sbn.getNotification().tickerText !=null) {
            ticker = sbn.getNotification().tickerText.toString();
        }
        Bundle extras = sbn.getNotification().extras;
        String title = extras.getString("android.title");
        String text = extras.getCharSequence("android.text").toString();

        Intent msgrcv = new Intent("NOTIFICATION_POSTED_KBT");
        msgrcv.putExtras(extras);

        LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i(TAG, "********** onNOtificationRemoved");
    }

}

NotificationListenerModule.java

public class NotificationListenerModule extends ReactContextBaseJavaModule {
    Context mainContext;
    public NotificationListenerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mainContext = getReactApplicationContext();
    }

    @Override
    public String getName() {
        return "BatteryStatus";
    }

    @ReactMethod
    public void registerNotificationEvent(Callback successCallback) {

        // This log is printed successfully hence this function is getting called.
        Log.d("KBT","registerNotificationEvent called");

        // Registering Receiver
        LocalBroadcastManager.getInstance(mainContext).registerReceiver(myReceiver, new IntentFilter("NOTIFICATION_POSTED_KBT"));

        // Check Notification Permission in our app
        ComponentName cn = new ComponentName(getReactApplicationContext(), NotificationListener.class);
        String flat = Settings.Secure.getString(getReactApplicationContext().getContentResolver(), "enabled_notification_listeners");
        final boolean enabled = flat != null && flat.contains(cn.flattenToString());
]    }


    private class NLServiceReceiver extends BroadcastReceiver {

        @Override public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            JSONObject json = new JSONObject();
            Set<String> keys = bundle.keySet();
            for (String key : keys) {
                try {
                    // json.put(key, bundle.get(key)); see edit below
                    json.put(key, JSONObject.wrap(bundle.get(key)));
                } catch(JSONException e) {
                    //Handle exception here
                }
            }

            // Emitting the event to React Native
            getReactApplicationContext()
                        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                        .emit("onNotificationPosted", json);
        }
    }
}

Logs (com.logcharge is my package name)

    09-23 10:19:23.968 1035-1653/? E/InputDispatcher: channel '2888e2a com.logcharge/com.logcharge.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
09-23 10:19:24.175 2465-3354/? E/RecentsTaskLoader: Unexpected null component name or activity info: ComponentInfo{com.logcharge/com.logcharge.MainActivity}, null
09-23 10:19:24.177 2465-3354/? E/RecentsTaskLoader: Unexpected null component name or activity info: ComponentInfo{com.logcharge/com.logcharge.MainActivity}, null
09-23 10:19:24.662 2668-2668/? E/OPUtils: removeMultiApp ,com.logcharge
09-23 10:19:26.981 1035-1324/? E/ActivityManager: Failure starting process com.logcharge
    java.lang.SecurityException: Package com.logcharge was not found!
        at com.android.server.pm.PackageManagerService.checkPackageStartable(PackageManagerService.java:4350)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4446)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4407)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.server.am.EmbryoHelper.startProcessLocked(EmbryoHelper.java:93)
        at com.android.server.am.Uterus$BirthRunnable.run(Uterus.java:720)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)
09-23 10:20:19.029 1035-1370/? E/PackageManager.DexOptimizer: Well this is awkward; package com.logcharge.MainApplication had UID -1
    java.lang.Throwable
        at com.android.server.pm.PackageDexOptimizer.performDexOptLI(PackageDexOptimizer.java:150)
        at com.android.server.pm.PackageDexOptimizer.performDexOpt(PackageDexOptimizer.java:126)
        at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:19987)
        at com.android.server.pm.PackageManagerService.installPackageTracedLI(PackageManagerService.java:19547)
        at com.android.server.pm.PackageManagerService.-wrap35(Unknown Source:0)
        at com.android.server.pm.PackageManagerService$9.run(PackageManagerService.java:16810)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)
        at com.android.server.ServiceThread.run(ServiceThread.java:46)
09-23 10:20:21.277 25936-25936/? E/SensorManager: sensorName:BMI160 Accelerometer,isWakeUpSensor:false,callingApp: com.logcharge,callingPid:25936,callingUid:10632
09-23 10:20:22.014 646-659/? E/cutils: Nothing there yet; let's create it: /storage/emulated/0/Android/data/com.logcharge
09-23 10:20:22.015 646-659/? E/cutils: Nothing there yet; let's create it: /storage/emulated/0/Android/data/com.logcharge/cache

回答1:


This is weird but I've got it successfully running the next day after doing the following things very carefully (Without skipping any steps)

  1. Uninstall the Application

  2. Stop/Close react native server

  3. Renaming the NotificationListenerService class file

  4. Reconnect the USB cable (If not simulator) and change Connect type from Charge only to Media Transfer

  5. Build your android code

  6. Execute react-native run-android

  7. Pray God _/\_ (Just kidding, but it helps though)

Best of luck.



来源:https://stackoverflow.com/questions/52456992/android-permisson-bind-notification-listener-service-is-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!