Уведомление не отображается на Android 8

Мне нужно сделать, чтобы показать уведомление на Android, но я не могу найти правильное решение для этого. Вроде все идеально.

XML основного класса (только ImageButton): **

<ImageButton
        android:id="@+id/notification"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:backgroundTint="@color/colorPrimaryDark"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.35"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.695"
        app:srcCompat="@android:drawable/btn_star_big_on" />

**

Кнопка "Инициализировать":

private void addelement(){
notify = (ImageButton) findViewById(R.id.notification);
}

Метод уведомления():

public void notification (View view){
        Intent intent = new Intent(this, notification.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder b = new NotificationCompat.Builder(this);

    b.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setTicker("Hearty365")
            .setSmallIcon(R.mipmap.ic_launcher_round)
            .setContentTitle("Default notification")
            .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND)
            .setContentIntent(contentIntent)
            .setContentInfo("Info");


    NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, b.build());
}

Я вызываю метод notification() для ImageButton

notify.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                notification(view);
            }  
        });

Теперь это моя активность уведомлений:

public class notification extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_notification);
    }
}

И мой XML уведомления:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.carlosroldan.merlinminerapp.notification">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Info on the notification"
            android:id="@+id/Texto"
            android:textSize="16sp"
            />

</android.support.constraint.ConstraintLayout>

У меня есть отладка проекта, и он застревает на этом:

public boolean performClick() {
        throw new RuntimeException("Stub!");
    }

Основная ошибка LogCat:

07-28 11:17:08.595 1487-2742/? E/NotificationService: No Channel found for pkg=com.example.carlosroldan.merlinminerapp, channelId=null, opPkg=com.example.carlosroldan.merlinminerapp, callingUid=10084, userId=0, incomingUserId=0, notificationUid=10084, notification=Notification(channel=null pri=0 contentView=null vibrate=null sound=default defaults=0x1 flags=0x10 color=0x00000000 vis=PRIVATE)

Это мой LogCat при запуске и попытке выполнить метод:

07-28 11:13:45.062 7553-7553/? I/zygote: Not late-enabling -Xcheck:jni (already on)
07-28 11:13:45.122 7553-7553/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
07-28 11:13:45.779 7553-7553/com.example.carlosroldan.merlinminerapp I/InstantRun: starting instant run server: is main process
07-28 11:13:46.576 7553-7598/com.example.carlosroldan.merlinminerapp D/OpenGLRenderer: HWUI GL Pipeline
07-28 11:13:46.695 7553-7598/com.example.carlosroldan.merlinminerapp I/OpenGLRenderer: Initialized EGL, version 1.4
07-28 11:13:46.695 7553-7598/com.example.carlosroldan.merlinminerapp D/OpenGLRenderer: Swap behavior 1
07-28 11:13:46.695 7553-7598/com.example.carlosroldan.merlinminerapp W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
07-28 11:13:46.695 7553-7598/com.example.carlosroldan.merlinminerapp D/OpenGLRenderer: Swap behavior 0
07-28 11:13:46.705 7553-7598/com.example.carlosroldan.merlinminerapp D/EGL_emulation: eglCreateContext: 0xa39fd3c0: maj 2 min 0 rcv 2
07-28 11:13:46.755 7553-7598/com.example.carlosroldan.merlinminerapp D/EGL_emulation: eglMakeCurrent: 0xa39fd3c0: ver 2 0 (tinfo 0xa4bf2d40)
07-28 11:13:46.803 7553-7598/com.example.carlosroldan.merlinminerapp W/[email protected]::Mapper: getService: found null hwbinder interface
07-28 11:13:46.847 7553-7598/com.example.carlosroldan.merlinminerapp I/vndksupport: sphal namespace is not configured for this process. Loading /system/lib/hw/gralloc.ranchu.so from the current namespace instead.
07-28 11:13:46.972 7553-7598/com.example.carlosroldan.merlinminerapp D/EGL_emulation: eglMakeCurrent: 0xa39fd3c0: ver 2 0 (tinfo 0xa4bf2d40)
07-28 11:13:48.891 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Do partial code cache collection, code=19KB, data=25KB
07-28 11:13:48.939 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: After code cache collection, code=19KB, data=26KB
07-28 11:13:48.939 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Increasing code cache capacity to 128KB
07-28 11:13:48.945 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Do partial code cache collection, code=19KB, data=43KB
07-28 11:13:48.946 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: After code cache collection, code=19KB, data=43KB
07-28 11:13:48.946 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Increasing code cache capacity to 256KB
07-28 11:13:48.947 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: JIT allocated 72KB for compiled code of void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-28 11:13:48.947 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-28 11:13:49.098 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Do full code cache collection, code=100KB, data=60KB
07-28 11:13:49.101 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: After code cache collection, code=97KB, data=45KB
07-28 11:13:49.891 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Do partial code cache collection, code=125KB, data=57KB
07-28 11:13:49.896 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: After code cache collection, code=121KB, data=56KB
07-28 11:13:49.896 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Increasing code cache capacity to 512KB
07-28 11:13:50.904 7553-7598/com.example.carlosroldan.merlinminerapp D/EGL_emulation: eglMakeCurrent: 0xa39fd3c0: ver 2 0 (tinfo 0xa4bf2d40)
07-28 11:13:56.008 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: Do full code cache collection, code=240KB, data=163KB
07-28 11:13:56.009 7553-7558/com.example.carlosroldan.merlinminerapp I/zygote: After code cache collection, code=162KB, data=113KB

Спасибо


person Carlos Roldan    schedule 28.07.2017    source источник
comment
уведомление.класс - это активность..?   -  person Muthukrishnan Rajendran    schedule 28.07.2017
comment
Можете ли вы показать нам свою активность? Где и когда вы вызываете свой метод уведомления ()? Показывает ли LogCat какие-либо исключения или сообщения?   -  person    schedule 28.07.2017
comment
Я отредактирую, чтобы показать активность уведомлений прямо сейчас   -  person Carlos Roldan    schedule 28.07.2017


Ответы (4)


Попробуйте следующий код, он работает:

public void showNotification(Context context, String title, String message) {
        Intent notifyIntent = new Intent(context, notification.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(context, 0,
                new Intent[]{notifyIntent}, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(context)
                .setSmallIcon(android.R.drawable.ic_dialog_info)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);
    }
person Usman Rana    schedule 28.07.2017
comment
Убедитесь, что эта функция вызывается или нет? показать некоторые журналы или тосты в первой строке этой функции - person Usman Rana; 28.07.2017
comment
Функция вызывается ImageButton. Я опубликую LogCat прямо сейчас :) - person Carlos Roldan; 28.07.2017
comment
Это ошибка LogCat 07-28 11:17:08.595 1487-2742/? E/NotificationService: No Channel found for pkg=com.example.carlosroldan.merlinminerapp, channelId=null, opPkg=com.example.carlosroldan.merlinminerapp, callingUid=10084, userId=0, incomingUserId=0, notificationUid=10084, notification=Notification(channel=null pri=0 contentView=null vibrate=null sound=default defaults=0x1 flags=0x10 color=0x00000000 vis=PRIVATE) - person Carlos Roldan; 28.07.2017
comment
версия вашего устройства? Я думаю, что сервисы Google Play недоступны для этого. Обновите его, а затем попробуйте. В коде нет проблем - person Usman Rana; 28.07.2017
comment
Эмулятор Nexus_5X_API_ Android 8.0.0, API 26 - person Carlos Roldan; 28.07.2017
comment
Поскольку это эмулятор, как я могу установить это обновление? заранее спасибо - person Carlos Roldan; 28.07.2017
comment
Но я проверил, и на нем есть сервисы GOogle Play. - person Carlos Roldan; 28.07.2017
comment
если это так, то у него должна быть обновленная версия, поскольку вы используете API 26, последнюю на сегодняшний день. Попробуйте тот же код на другом устройстве, там все сработает. - person Usman Rana; 28.07.2017
comment
Я попытаюсь сгенерировать apk и протестировать его на своем телефоне. - person Carlos Roldan; 28.07.2017
comment
О Боже! Большое спасибо Усман! Я действительно ценю твою помощь. На телефоне работало - person Carlos Roldan; 28.07.2017
comment
'Рад был помочь. - person Usman Rana; 28.07.2017

Начиная с API 26 (Android 8.0) вам необходимо зарегистрироваться и установить NotificationChannel для отображения уведомления.

  1. Зарегистрируйте NotificationChannel, например. в вашей основной активности:

    // Register NotificationChannels needed for API 26+ to display notification messages
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationManager mNotificationManager = (NotificationManager)getSystemService(
                Context.NOTIFICATION_SERVICE);
        NotificationChannel infoChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID_INFO,
                getString(R.string.notification_channel_name_info), NotificationManager.IMPORTANCE_DEFAULT);
        infoChannel.setDescription(getString(R.string.notification_channel_description_info));
        infoChannel.enableLights(false);
        infoChannel.enableVibration(false);
        mNotificationManager.createNotificationChannel(infoChannel);
    }
    
  2. Определите NotificationChannel для вашего уведомления:

    Notification notification = new NotificationCompat.Builder(getContext())
            (...)
            .setChannelId(NOTIFICATION_CHANNEL_ID_INFO)
            .build();
    NotificationManager notificationManager = (NotificationManager)getContext().getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(CAPTURING_ONGOING_NOTIFICATION_ID, notification);
    
person hb0    schedule 28.09.2017

Из документации по Android 8:

Android O представляет каналы уведомлений, чтобы предоставить единую систему, помогающую пользователям управлять уведомлениями. Когда вы ориентируетесь на Android O, вы должны реализовать один или несколько каналов уведомлений, чтобы отображать уведомления для ваших пользователей. Если вы не ориентируетесь на Android O, ваши приложения ведут себя так же, как и на Android 7.0, при работе на устройствах Android O.

Итак, перейдите по приведенной выше ссылке в документации и узнайте, как (1) создать канал уведомлений и (2) использовать канал при отображении уведомления.

person Vit Khudenko    schedule 07.08.2017

Ваше название действия и название метода совпадают. переименовать любой. давайте переименуем метод так,

метод showMyNotification:

public void showMyNotification (View view){
        Intent intent = new Intent(this, notification.class);
        PendingIntent contentIntent = P

И сделайте вызов из уведомления (Ваша активность) следующим образом:

notify.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showMyNotification(view);
            }  
        });

Уведомление появляется!

person Community    schedule 28.07.2017
comment
когда отладчик сообщает об ошибке, которую я написал в теле этого вопроса :) - person Carlos Roldan; 28.07.2017
comment
Почему вы используете метод PerformClick()? Просто найдите идентификатор по представлению и зарегистрируйте прослушиватель кликов. ImageButton notify = (ImageButton) findViewById(R.id.notify); уведомление.setOnClick...... - person ; 28.07.2017
comment
Я не использовал, он переходит прямо в View.class при выходе из метода - person Carlos Roldan; 28.07.2017
comment
не могли бы вы опубликовать свой макет xml с уведомлением ImageButton. - person ; 28.07.2017
comment
Пока нет, я не могу найти, почему бы и нет... Я нашел LogCat, связанный с этой ошибкой, вот этот: 07-28 11:17:08.595 1487-2742/? E/NotificationService: No Channel found for pkg=com.example.carlosroldan.merlinminerapp, channelId=null, opPkg=com.example.carlosroldan.merlinminerapp, callingUid=10084, userId=0, incomingUserId=0, notificationUid=10084, notification=Notification(channel=null pri=0 contentView=null vibrate=null sound=default defaults=0x1 flags=0x10 color=0x00000000 vis=PRIVATE) - person Carlos Roldan; 28.07.2017