web-dev-qa-db-ja.com

Android 8.1 API 27通知が表示されない

Android 8.1 API 27でトーストを取得します:

パッケージ「my_package_name」の開発者警告
通知を投稿できませんでした...

Logcatには次の文字列が含まれます。

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

W/Notification:代わりにAndroid.media.AudioAttributesを使用して再生のユースケースを修飾するものについては、setSound()のドキュメントを参照してください

E/NotificationService:pkg = my_package_nameのチャネルが見つかりません

ToastとLogcatの完全な情報は、この問題のローカライズに役立ちます。

28
Andy Sander

このエラーが発生した場合、2つのアイテムに注意を払い、注文する必要があります。

  1. NotificationChannel mChannel = new NotificationChannel(id, name, importance);
  2. builder = new NotificationCompat.Builder(context, id);

また、NotificationManager notifManagerとNotificationChannel mChannelは一度だけ作成されます。

通知に必要なセッターがあります。

  • builder.setContentTitle()//必須
  • .setSmallIcon()//必須
  • .setContentText()//必須

例を参照してください:

private NotificationManager notifManager;
public void createNotification(String aMessage, Context context) {
    final int NOTIFY_ID = 0; // ID of notification
    String id = context.getString(R.string.default_notification_channel_id); // default_channel_id
    String title = context.getString(R.string.default_notification_channel_title); // Default Channel
    Intent intent;
    PendingIntent pendingIntent;
    NotificationCompat.Builder builder;
    if (notifManager == null) {
        notifManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = notifManager.getNotificationChannel(id);
        if (mChannel == null) {
            mChannel = new NotificationChannel(id, title, importance);
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            notifManager.createNotificationChannel(mChannel);
        }
        builder = new NotificationCompat.Builder(context, id);
        intent = new Intent(context, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        builder.setContentTitle(aMessage)                            // required
               .setSmallIcon(Android.R.drawable.ic_popup_reminder)   // required
               .setContentText(context.getString(R.string.app_name)) // required
               .setDefaults(Notification.DEFAULT_ALL)
               .setAutoCancel(true)
               .setContentIntent(pendingIntent)
               .setTicker(aMessage)
               .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
    }
    else {
        builder = new NotificationCompat.Builder(context, id);
        intent = new Intent(context, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        builder.setContentTitle(aMessage)                            // required
               .setSmallIcon(Android.R.drawable.ic_popup_reminder)   // required
               .setContentText(context.getString(R.string.app_name)) // required
               .setDefaults(Notification.DEFAULT_ALL)
               .setAutoCancel(true)
               .setContentIntent(pendingIntent)
               .setTicker(aMessage)
               .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
               .setPriority(Notification.PRIORITY_HIGH);
    }
    Notification notification = builder.build();
    notifManager.notify(NOTIFY_ID, notification);
}
69
Andy Sander

Andyの答えは機能していますが、非推奨のBuilderを避けて FireBase Quickstart Project に従うことを避けたかったのです。マネージャーから通知する前にコードを追加しました。

String channelId = "default_channel_id";
String channelDescription = "Default Channel";
// Since Android Oreo notification channel is needed.
//Check if notification channel exists and if not create one
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
    NotificationChannel notificationChannel = notificationManager.getNotificationChannel(channelId);
    if (notificationChannel == null) {
        int importance = NotificationManager.IMPORTANCE_HIGH; //Set the importance level
        notificationChannel = new NotificationChannel(channelId, channelDescription, importance);
        notificationChannel.setLightColor(Color.GREEN); //Set if it is necesssary
        notificationChannel.enableVibration(true); //Set if it is necesssary
        notificationManager.createNotificationChannel(notificationChannel);
    }
}

//notificationManager.notify as usual

Edit:彼らは、例からチャンネルの存在チェックを削除しました。理由はわかりません。

16
engincancan

チャネルIDを設定しましたが、通知はまだ表示されません。

最後に、私の問題は「setContentText()」メソッドを呼び出さないことがわかりました。

@ Andy Sander が「必須のセッター」に言及しているのは本当に助かりました!

以下は、Android 8 Oreo API 26以降の通知に必要なセッターです。

builder.setContentTitle() // required
.setSmallIcon() // required
.setContentText() // required
.setChannelId(id) // required for deprecated in API level >= 26 constructor .Builder(this)
9
Magic

また、channel_idを通知ビルダーにバインドすることを忘れないでください。バインドした後、私の問題はなくなりました。

notificationBuilder.setChannelId(channelId)

または

NotificationCompat.Builder(Context context, String channelId)
3
asozcan