【问题标题】:On Android 8.1 API 27 notification does not display在 Android 8.1 API 27 上不显示通知
【发布时间】:2017-10-28 14:50:49
【问题描述】:

我在 Android 8.1 API 27 上获得了 Toast:

包“my_package_name”的开发者警告
未能在...上发布通知

Logcat 包含下一个字符串:

通知:其他操作不推荐使用流类型 比音量控制

W/Notification:请参阅 setSound() 的文档了解如何使用 而是使用 android.media.AudioAttributes 来限定您的播放 用例

E/NotificationService:没有找到 pkg=my_package_name 的频道

Toast 和 Logcat 中的完整信息可以帮助本地化这个问题。

【问题讨论】:

标签: android notifications android-notifications android-8.0-oreo


【解决方案1】:

如果您收到此错误,请注意 2 个项目和它们的顺序:

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

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

【讨论】:

  • * 我已经设置了频道ID,但仍然没有显示通知; * 最后我发现我的问题是没有调用“setContentText()”方法 * 你提到的“必需的设置器”对我很有帮助!
  • 工作。非常感谢:)
  • 经过数小时的反复试验,偶然发现了这个,瞧!谢谢。
  • 精彩的教程!!但为了让它工作,我在 if(SDK version) 中将 NotificationComppat.Builder 更改为 Notificaction.Builder
【解决方案2】:

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

编辑: 他们从示例中删除了频道存在检查,我不知道为什么。

【讨论】:

    【解决方案3】:

    我已设置频道 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)
    

    【讨论】:

    【解决方案4】:

    也不要忘记将您的 channel_id 绑定到您的通知生成器。绑定后,我的问题就解决了。

    notificationBuilder.setChannelId(channelId)
    

    NotificationCompat.Builder(Context context, String channelId)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多