16

API 18 の新しい NotificationListenerService クラスを使用しようとしている Android アプリケーションがあります。このクラスから継承し、onNotificationPosted および onNotificationRemoved イベントをオーバーライドする独自のサービス クラスを作成しました。通知を取得または削除すると呼び出されるようです。

このクラス、またはこのクラスの使用方法を正確に示すために共有するソースコードで成功した人はいますか?

4

9 に答える 9

31

私の経験では、これらの答えのほとんどすべてが正しい解決策に非常に近いものです!

コアの問題は開発中に発生するようです。コードを開発しているため、デバッグ セッション間でアプリを更新すると、「通知アクセス」設定が受け入れられなくなります。

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);
    }
}
于 2016-05-06T20:45:07.400 に答える
4

このバグに遭遇しました:

https://code.google.com/p/android/issues/detail?id=59044

そして、電話を再起動した後にのみ、通知が私のサービスに届き始めました。

于 2014-09-08T18:03:03.833 に答える