API 18 の新しい NotificationListenerService クラスを使用しようとしている Android アプリケーションがあります。このクラスから継承し、onNotificationPosted および onNotificationRemoved イベントをオーバーライドする独自のサービス クラスを作成しました。通知を取得または削除すると呼び出されるようです。
このクラス、またはこのクラスの使用方法を正確に示すために共有するソースコードで成功した人はいますか?
API 18 の新しい NotificationListenerService クラスを使用しようとしている Android アプリケーションがあります。このクラスから継承し、onNotificationPosted および onNotificationRemoved イベントをオーバーライドする独自のサービス クラスを作成しました。通知を取得または削除すると呼び出されるようです。
このクラス、またはこのクラスの使用方法を正確に示すために共有するソースコードで成功した人はいますか?
私の経験では、これらの答えのほとんどすべてが正しい解決策に非常に近いものです!
コアの問題は開発中に発生するようです。コードを開発しているため、デバッグ セッション間でアプリを更新すると、「通知アクセス」設定が受け入れられなくなります。
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);
}
}
このバグに遭遇しました:
https://code.google.com/p/android/issues/detail?id=59044
そして、電話を再起動した後にのみ、通知が私のサービスに届き始めました。