我正在使用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.在通知访问"设置中看不到我的应用程序.
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)
卸载应用程序
Uninstall the Application
停止/关闭本机服务器
重命名NotificationListenerService类文件
重新连接USB电缆(如果不是模拟器)并更改连接类型 从Charge only到Media 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
发布评论