Android 权限 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用

2024-05-07

我正在 React Native 应用程序中工作。我正在努力在 Android 中使用Notification Services & BIND_NOTIFICATION_LISTENER_SERVICE。我正在尝试使用读取传入的通知NotificationListenerService.

我在用着一加 5T(安卓奥利奥)用于调试。

我见过很多重复的问题我试过了我从这些问题中得到了以下解决方案。

1.重启手机(听起来很傻而且不起作用)

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

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

我一直面临的问题,

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

2.当我收到任何通知时,onCreate / onNotificationPosted 不会被调用

3.使用下面的代码检查我的应用程序是否具有通知权限,它返回“false”(显然,这是我的问题)

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未列出Dangerous permissions列表,我认为在清单中定义它(下面给出了源代码供您参考)就足够了,而不是询问运行时权限。

我已经关注了this http://www.androiddevelopersolutions.com/2015/05/android-read-status-bar-notification.html教程并还参考了其他教程。我找不到我哪里做错了。一切看起来都很完美。经过一整天的绞尽脑汁之后,我想我应该请求你的帮助。

在下面找到我的源代码。

感谢您的时间和耐心。 (:

我的来源

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>

通知监听器.java(甚至没有打印单个日志)

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

}

通知监听器模块.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是我的包名)

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

  2. 停止/关闭反应本机服务器

  3. 重命名NotificationListenerService类文件

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

  5. 构建你的 Android 代码

  6. Execute react-native run-android

  7. 祈祷上帝_/\_(开玩笑,但它有帮助)

祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 权限 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用 的相关文章

  • BottomNavigationView - 如何获取选定的菜单项?

    我使用BottomNavigationView来切换片段 如何获取当前选定的菜单项 以防止重新打开片段 BottomNavigationView bottomNavigationView BottomNavigationView findV
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 为什么将函数参数声明为最终的?

    我目前正在阅读 Sams 出版的 24 小时自学 Android 应用程序开发 一书 我对 Java Android 或其他方面还比较陌生 我对 ActionScript 3 有非常扎实的背景 它与 Java 有足够的相似之处 因此该语言本
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • Android 版 Robotium - solo.searchText () 不起作用

    我在使用 Robotium 时遇到 searchText 函数问题 我正在寻找这个字符串
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐