在Android 8.1 API 27上,通知不会显示

时间:2017-10-28 14:50:49

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

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

  

包“my_package_name”的开发人员警告   无法在...上发布通知。

Logcat包含下一个字符串:

  

通知:对于其他操作,不推荐使用流类型   而不是音量控制

     

W / Notification:请参阅setSound()的文档以了解要使用的内容   而是使用android.media.AudioAttributes来限定你的播放   用例

     

E / NotificationService:找不到pkg = my_package_name

的频道

Toast和Logcat中的完整信息可以帮助解决此问题。

4 个答案:

答案 0 :(得分:67)

如果你得到这个错误,应该注意2个项目并且他们订购:

  1. NotificationChannel mChannel = new NotificationChannel(id, name, importance);
  2. builder = new NotificationCompat.Builder(context, id);
  3. 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);
    }
    

答案 1 :(得分:16)

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

修改 他们从示例中删除了通道存在检查我不知道为什么。

答案 2 :(得分:9)

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

答案 3 :(得分:3)

也不要忘记将channel_id绑定到通知构建器。绑定后,我的问题消失了。

notificationBuilder.setChannelId(channelId)

NotificationCompat.Builder(Context context, String channelId)