web-dev-qa-db-ja.com

Android Oreoで通知が表示されない(API 26)

Android Oに通知を表示しようとすると、このメッセージが表示されます。

ストリームタイプの使用は、ボリュームコントロール以外の操作では非推奨です

通知はサンプルドキュメントから直接のものであり、Android 25で正常に表示されます。

43
Sky Kelsey

このGoogle+の投稿 に関するコメント:

Android OデバイスでNotificationCompatを使用する場合、これらの[警告]は現在期待されています(カスタムサウンドを渡さなくても、NotificationCompatは常にsetSound()を呼び出します)。

サポートライブラリがAudioAttributessetSoundバージョンを使用するようにコードを変更するまで、常にその警告が表示されます。

したがって、この警告に対してできることは何もありません。 通知チャネルガイド 、Android Oによれば、特定の通知すべてで使用される通知チャネルにサウンドを設定する代わりに、個々の通知にサウンドを設定することは非推奨ですタイプ。

60
ianhanniballake

Android Oから始めて、 NotificationChannel を構成し、通知を表示しようとするときにそのチャネルを参照する必要があります。

private static final int NOTIFICATION_ID = 1;
private static final String NOTIFICATION_CHANNEL_ID = "my_notification_channel";

...

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);

  // Configure the notification channel.
  notificationChannel.setDescription("Channel description");
  notificationChannel.enableLights(true);
  notificationChannel.setLightColor(Color.RED);
  notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
  notificationChannel.enableVibration(true);
  notificationManager.createNotificationChannel(notificationChannel);
}

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
  .setVibrate(new long[]{0, 100, 100, 100, 100, 100})
  .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
  .setSmallIcon(R.mipmap.ic_launcher)
  .setContentTitle("Content Title")
  .setContentText("Content Text");

  notificationManager.notify(NOTIFICATION_ID, builder.build());

重要な注意事項:

  1. NotificationChannelで指定された振動パターンなどの設定は、実際のNotificationで指定された設定をオーバーライドします。私は知っている、その直感に反する。通知に変更する設定を移動するか、構成ごとに異なるNotificationChannelを使用する必要があります。
  2. createNotificationChannel()に渡した後は、ほとんどのNotificationChannel設定を変更できません。 deleteNotificationChannel()を呼び出してから、再度追加することもできません。削除されたNotificationChannelのIDを使用すると復活し、最初に作成されたときと同じように不変になります。アプリがアンインストールされるまで、古い設定が引き続き使用されます。そのため、チャンネルの設定を確認し、それらの設定を有効にするためにそれらの設定で遊んでいる場合はアプリを再インストールすることをお勧めします。
44
Sky Kelsey

@ sky-kelseyが説明したことはすべて良いです、ほんの少しの追加

すでに登録されている場合は、毎回同じチャンネルを登録するべきではないので、私のためにチャンネルを作成するUtilsクラスメソッドがあります:

public static final String NOTIFICATION_CHANNEL_ID_LOCATION = "notification_channel_location";

public static void registerLocationNotifChnnl(Context context) {
    if (Build.VERSION.SDK_INT >= 26) {
        NotificationManager mngr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        if (mngr.getNotificationChannel(NOTIFICATION_CHANNEL_ID_LOCATION) != null) {
            return;
        }
        //
        NotificationChannel channel = new NotificationChannel(
                NOTIFICATION_CHANNEL_ID_LOCATION,
                context.getString(R.string.notification_chnnl_location),
                NotificationManager.IMPORTANCE_LOW);
        // Configure the notification channel.
        channel.setDescription(context.getString(R.string.notification_chnnl_location_descr));
        channel.enableLights(false);
        channel.enableVibration(false);
        mngr.createNotificationChannel(channel);
    }
}

strings.xml:

<string name="notification_chnnl_location">Location polling</string>
<string name="notification_chnnl_location_descr">You will see notifications on this channel ONLY during location polling</string>

そして、タイプの通知を表示する前に毎回メソッドを呼び出します。

    ...
    NotificationUtil.registerLocationNotifChnnl(this);
    return new NotificationCompat.Builder(this, NotificationUtil.NOTIFICATION_CHANNEL_ID_LOCATION)
            .addAction(R.mipmap.ic_launcher, getString(R.string.open_app),
                    activityPendingIntent)
            .addAction(Android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.remove_location_updates),
                    servicePendingIntent)
            .setContentText(text)
            ...

別の典型的な問題-チャネルのデフォルトの音-ここで説明します: https://stackoverflow.com/a/45920861/2133585

8
Kirill Vashilo

Android Oでは、NotificationChannelを使用する必要があり、NotificationCompat.Builderは非推奨です( reference )。

以下にサンプルコードを示します。

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

NotificationManager mNotificationManager =
        (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel("notify_001",
            "Channel human readable title",
            NotificationManager.IMPORTANCE_DEFAULT);
    mNotificationManager.createNotificationChannel(channel);
}

mNotificationManager.notify(0, mBuilder.build());
2