android - 无法让 NotificationListenerService 类工作

标签 android

我有一个 android 应用程序正在尝试使用 api 18 中的新 NotificationListenerService 类。我创建了自己的服务类,该类继承自此类并覆盖了 onNotificationPosted 和 onNotificationRemoved 事件,尽管我的服务似乎可以正常启动这些当我收到或删除通知时,似乎从未调用 2 个事件。

有没有人在这个类上取得过任何成功,或者他们愿意分享的任何源代码来展示如何使用这个类?

最佳答案

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

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

关于android - 无法让 NotificationListenerService 类工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17911883/

相关文章:

android - 如果数据不共享给其他应用程序,ContentProvider 对于 SearchView 来说是多余的吗?

Android:如何获取特定 mp3 歌曲的元数据

Android 在不水平拉伸(stretch)视频的情况下将 VideoView 方向从纵向切换为横向

Java LIBGDX,从另一个类调用InputHandler的TouchDown方法

android - 我怎样才能改变我的安卓应用程序的图标

java - 如何在 Android 中修复 "The application may be doing too much work on its main thread"?

java - Firebase .orderByChild - 尝试对数字进行排序,但它只对第一个数字进行排序

android - 更改 API header 中的用户类型或使用变量更改 header

Android - 如何从相机捕获图像或从库中添加

android - 魅族设备上 Editor.updateCursorPositionMz 出现 NullPointerException