Android权限BIND_NOTIFICATION_LISTENER_SERVICE无法正常工作 [英] Android permisson BIND_NOTIFICATION_LISTENER_SERVICE is not working

查看:1111
本文介绍了Android权限BIND_NOTIFICATION_LISTENER_SERVICE无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用React Native Application.我正在Android中努力使用Notification Services& BIND_NOTIFICATION_LISTENER_SERVICE.我正在尝试使用NotificationListenerService阅读传入的通知.

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.

我正在使用 One Plus 5T(Android Oreo)进行调试.

我已经看到很多重复的问题,并且我已经尝试从这些问题中得到的以下解决方案.

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

1.重新启动手机(听起来很傻,无法正常工作)

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

2.重新安装/重新构建应用程序

2.Re-install/Re-build the application

  1. 重命名NotificationListenerService类文件并运行Etc.

我一直面临的问题

1.在通知访问"设置中看不到我的应用程序.

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

2.onCreate/onNotificationPosted没有被调用

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

3.使用以下代码检查我的应用程序是否具有通知"权限,并返回"false"(很明显,这是我的 问题)

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

由于BIND_NOTIFICATION_LISTENER_SERVICE没有列出Dangerous permissions列表,所以我认为在清单中定义它(下面提供了源供您参考)就足够了,而不是询问运行时权限.

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.

我的来源

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 (甚至没有打印单个日志)

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

日志(com.logcharge是我的软件包名称)

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

推荐答案

这很奇怪,但经过非常仔细的操作(无需跳过任何步骤),第二天我就成功运行了

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. 卸载应用程序

  1. Uninstall the Application

停止/关闭本机服务器

重命名NotificationListenerService类文件

重新连接USB电缆(如果不是模拟器)并更改连接类型 从Charge onlyMedia Transfer

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

构建您的android代码

Build your android code

执行react-native run-android

祈求上帝_/\ _(开个玩笑,但有帮助)

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

祝你好运.

这篇关于Android权限BIND_NOTIFICATION_LISTENER_SERVICE无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆