首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android 8.1 API 27上不显示通知

在Android 8.1 API 27上不显示通知
EN

Stack Overflow用户
提问于 2017-10-28 22:50:49
回答 4查看 49.4K关注 0票数 41

我在Android 8.1 API 27上得到Toast:

包"my_package_name“的

开发人员警告

无法在...发布通知...

Logcat包含下一个字符串:

通知:对于音量控制W/通知以外的操作,不建议使用流类型:请参阅setSound()的文档,了解如何使用android.media.AudioAttributes来限定播放用例

E/通知服务:找不到用于pkg=my_package_name的通道

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-28 23:14:23

如果你得到这个错误,应该注意2个项目,并对它们进行排序:

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

此外,NotificationManager notifManager和NotificationChannel mChannel仅创建一次。

Notification有必需的setter:

  • builder.setContentTitle() // required
  • .setSmallIcon() // required
  • .setContentText() //所需的

请参见示例:

代码语言:javascript
复制
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);
}
票数 98
EN

Stack Overflow用户

发布于 2017-12-18 22:10:37

安迪的回答是有效的,但是我想避免使用废弃的生成器,而是遵循FireBase Quickstart Project。我只是在管理器的通知前添加了代码。

代码语言:javascript
复制
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

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

票数 16
EN

Stack Overflow用户

发布于 2018-03-06 20:23:47

我已经设置了频道id,但是通知仍然没有显示。

最后我发现我的问题是没有调用"setContentText()“方法。

@Andy Sander提到了“必需的setter”,这对我真的很有帮助!

以下是Android 8 Oreo API 26和更高版本上的Notification所需的setter:

代码语言:javascript
复制
builder.setContentTitle() // required
.setSmallIcon() // required
.setContentText() // required
.setChannelId(id) // required for deprecated in API level >= 26 constructor .Builder(this)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46990995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档