Уведомление не отображается в Oreo
обычный строитель уведомлений не показывает уведомления на Android O
Как я могу показать уведомление на Android 8 Oreo?
есть ли недостающий кусок кода для отображения уведомления на Android O
9 ответов:
в Android O это необходимо использовать канал С помощью конструктора уведомлений
ниже приведен пример кода :
// Sets an ID for the notification, so it can be updated. int notifyID = 1; String CHANNEL_ID = "my_channel_01";// The id of the channel. CharSequence name = getString(R.string.channel_name);// The user-visible name of the channel. int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance); // Create a notification and set the notification channel. Notification notification = new Notification.Builder(MainActivity.this) .setContentTitle("New Message") .setContentText("You've received new messages.") .setSmallIcon(R.drawable.ic_notify_status) .setChannelId(CHANNEL_ID) .build();
или с обработкой совместимость с:
NotificationCompat notification = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .setChannelId(CHANNEL_ID).build(); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(mChannel); // Issue the notification. mNotificationManager.notify(notifyID , notification);
или если вы хотите просто исправить, то используйте следующий код:
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mNotificationManager.createNotificationChannel(mChannel); }
обновления: NotificationCompat.Справочник строителя
NotificationCompat.Builder(Context context)
этот конструктор был устаревшим в API уровня 26.0.0 так что вы должны используйте
Builder(Context context, String channelId)
так что не надо
setChannelId
С Новым конструктором.и вы должны использовать последнюю версию библиотеки AppCompat в настоящее время 26.0.2
compile "com.android.support:appcompat-v7:26.0.+"
источник Android Developers Channel на Youtube
кроме того, вы можете проверить официальные документы Android
кроме ответ, вам нужно создать канал уведомлений, прежде чем он может быть использован.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { /* Create or update. */ NotificationChannel channel = new NotificationChannel("my_channel_01", "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); }
Также вам нужно использовать каналы только если targetSdkVersion на 26 или выше.
Если вы используете NotificationCompat.Builder, вам также необходимо обновить бета-версию библиотеки поддержки:https://developer.android.com/topic/libraries/support-library/revisions.html#26-0-0-beta2 (чтобы иметь возможность позвонить
setChannelId
на совместимость строитель).будьте осторожны, так как это обновление библиотеки повышает minSdkLevel до 14.
здесь я публикую некоторые функции быстрого решения с намерением обработки
public void showNotification(Context context, String title, String body, Intent intent) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); int notificationId = 1; String channelId = "channel-01"; String channelName = "Channel Name"; int importance = NotificationManager.IMPORTANCE_HIGH; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { NotificationChannel mChannel = new NotificationChannel( channelId, channelName, importance); notificationManager.createNotificationChannel(mChannel); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(body); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addNextIntent(intent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); notificationManager.notify(notificationId, mBuilder.build()); }
public class MyFirebaseMessagingServices extends FirebaseMessagingService { private NotificationChannel mChannel; private NotificationManager notifManager; @Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().size() > 0) { try { JSONObject jsonObject = new JSONObject(remoteMessage.getData()); displayCustomNotificationForOrders(jsonObject.getString("title"), jsonObject.getString("description")); } catch (JSONException e) { e.printStackTrace(); } } } private void displayCustomNotificationForOrders(String title, String description) { if (notifManager == null) { notifManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationCompat.Builder builder; Intent intent = new Intent(this, Dashboard.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent; int importance = NotificationManager.IMPORTANCE_HIGH; if (mChannel == null) { mChannel = new NotificationChannel ("0", title, importance); mChannel.setDescription(description); mChannel.enableVibration(true); notifManager.createNotificationChannel(mChannel); } builder = new NotificationCompat.Builder(this, "0"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); pendingIntent = PendingIntent.getActivity(this, 1251, intent, PendingIntent.FLAG_ONE_SHOT); builder.setContentTitle(title) .setSmallIcon(getNotificationIcon()) // required .setContentText(description) // required .setDefaults(Notification.DEFAULT_ALL) .setAutoCancel(true) .setLargeIcon(BitmapFactory.decodeResource (getResources(), R.mipmap.logo)) .setBadgeIconType(R.mipmap.logo) .setContentIntent(pendingIntent) .setSound(RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)); Notification notification = builder.build(); notifManager.notify(0, notification); } else { Intent intent = new Intent(this, Dashboard.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = null; pendingIntent = PendingIntent.getActivity(this, 1251, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setContentTitle(title) .setContentText(description) .setAutoCancel(true) .setColor(ContextCompat.getColor(getBaseContext(), R.color.colorPrimary)) .setSound(defaultSoundUri) .setSmallIcon(getNotificationIcon()) .setContentIntent(pendingIntent) .setStyle(new NotificationCompat.BigTextStyle().setBigContentTitle(title).bigText(description)); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(1251, notificationBuilder.build()); } } private int getNotificationIcon() { boolean useWhiteIcon = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP); return useWhiteIcon ? R.mipmap.logo : R.mipmap.logo; } }
Это ошибка в firebase api версии 11.8.0, поэтому если вы уменьшите версию API, вы не столкнетесь с этой проблемой.
вот как вы делаете это
private fun sendNotification() { val notificationId = 100 val chanelid = "chanelid" val intent = Intent(this, MainActivity::class.java) intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // you must create a notification channel for API 26 and Above val name = "my channel" val description = "channel description" val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(chanelid, name, importance); channel.setDescription(description); // Register the channel with the system; you can't change the importance // or other notification behaviors after this val notificationManager = getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) } val mBuilder = NotificationCompat.Builder(this, chanelid) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("Want to Open My App?") .setContentText("Open my app and see good things") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setAutoCancel(true) // cancel the notification when clicked .addAction(R.drawable.ic_check, "YES", pendingIntent) //add a btn to the Notification with a corresponding intent val notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(notificationId, mBuilder.build()); }
Читать полный учебник на =>https://developer.android.com/training/notify-user/build-notification
для тех, кто борется с этим после попытки вышеуказанных решений, убедитесь, что идентификатор канала, используемый при создании канала уведомлений,одинаковых к идентификатору канала, заданному в построителе уведомлений.
const val CHANNEL_ID = "EXAMPLE_CHANNEL_ID" // create notification channel val notificationChannel = NotificationChannel(CHANNEL_ID, NOTIFICATION_NAME, NotificationManager.IMPORTANCE_HIGH) // building notification NotificationCompat.Builder(context) .setSmallIcon(android.R.drawable.ic_input_add) .setContentTitle("Title") .setContentText("Subtitle") .setPriority(NotificationCompat.PRIORITY_MAX) .setChannelId(CHANNEL_ID)
Android Notification Demo App для Android O, а также более низких версий API. Вот лучшее демо-приложение на GitHub-Demo 1 и GitHub-Demo 2.
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "CHANNEL_ID") ........ NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = "Hello";// The user-visible name of the channel. int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance); mNotificationManager.createNotificationChannel(mChannel); } mNotificationManager.notify(notificationId, notificationBuilder.build());