NotificationListenerService

NotificationListenerService

我有一个Android应用程序,试图使用api 18中的新NotificationListenerService类。我创建了一个从该类继承的服务类,并覆盖了onNotificationPosted和onNotificationRemoved事件,尽管我的服务似乎很好地开始了这两个事件,收到或删除通知时似乎被调用了。

有没有人在此类上取得过成功,或者他们将分享任何源代码,它们演示了如何使用此类?

最佳答案

以我的经验,几乎所有这些答案都非常接近正确的解决方案!

CORE 问题似乎在开发期间发生;在开发代码时,当您在调试 session 之间更新应用程序时,将不再遵循“通知访问”设置。

如果您的APK/二进制文件更改并且NotificationListenerService停止:

  • 重新启动可修复该问题。
  • 返回“通知访问”并禁用并重新启用您的应用程序,它将对其进行修复。

  • 希望这在通过Google Play更新您的应用程序时不会出现问题。

    最佳做法是,为我的应用程序添加一个溢出菜单选项,该选项仅在非发行版中显示,从而使我可以轻松访问设置:

    NotificationListener.java:
    public class NotificationListener
        extends NotificationListenerService
        implements RemoteController.OnClientUpdateListener
    {
        private static final int VERSION_SDK_INT = VERSION.SDK_INT;
    
        public static boolean supportsNotificationListenerSettings()
        {
            return VERSION_SDK_INT >= 19;
        }
    
        @SuppressLint("InlinedApi")
        @TargetApi(19)
        public static Intent getIntentNotificationListenerSettings()
        {
            final String ACTION_NOTIFICATION_LISTENER_SETTINGS;
            if (VERSION_SDK_INT >= 22)
            {
                ACTION_NOTIFICATION_LISTENER_SETTINGS = Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS;
            }
            else
            {
                ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
            }
    
            return new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS);
        }
    
        ...
    }
    

    menu_my_activity.xml:
    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MyActivity"
        >
    
        <item
            android:id="@+id/action_application_info"
            android:title="@string/action_application_info"
            app:showAsAction="never"
            />
    
        <item
            android:id="@+id/action_notification_settings"
            android:title="Notification Settings"
            app:showAsAction="never"
            />
    
    </menu>
    

    MyActivity.java:
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.menu_my_activity, menu);
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        MenuItem menuItem;
        menuItem = menu.findItem(R.id.action_application_info);
        if (menuItem != null)
        {
            menuItem.setVisible(BuildConfig.DEBUG);
        }
        menuItem = menu.findItem(R.id.action_notification_settings);
        if (menuItem != null)
        {
            menuItem.setVisible(BuildConfig.DEBUG && NotificationListener.supportsNotificationListenerSettings());
        }
        return super.onPrepareOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case R.id.action_application_info:
                startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName())));
                return true;
            case R.id.action_notification_settings:
                startActivity(NotificationListener.getIntentNotificationListenerSettings());
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    10-07 13:09