Switch to English?
Yes
Переключитись на українську?
Так
Переключиться на русскую?
Да
Przełączyć się na polską?
Tak
Разместите свой проект бесплатно и начните получать предложения от фрилансеров-исполнителей уже спустя минуты после публикации!

Сделать так, чтобы уведомления в андроид приложении выскакивали сверху (heads-up)

Translated500 UAH

Отзыв заказчика о сотрудничестве с Родіоном Шуліком

Качество
Профессионализм
Стоимость
Контактность
Сроки

Очень приятно было работать.
Выполнил все пожелания из технического задания плюс еще сверху то, что я запрашивал, он реализовал.
Всем рекомендую фрилансера!

Отзыв фрилансера о сотрудничестве с Романом Наливайко

Оплата
Постановка задачи
Четкость требований
Контактность

Очень приятный и вежливый заказчик)

  1. 1938    42  2
    1 день500 UAH

    Давайте разберемся в чем проблема.
    У меня есть опыт с пушами.
    Обращайтесь.

  2. 231    1  0
    Победившая ставка1 день500 UAH

    Привет!

    Я готов взять на себя выполнение этой задачи. У меня около трех лет опыта разработки Android-приложений, в частности, я уже работал с подобными функциями. Могу быстро и качественно реализовать необходимый функционал.

    Готов обсудить все детали в личных сообщениях. Могу приступить к работе сегодня.

    Буду рад сотрудничеству!

  • Олександр Некрутенко
    5 января 2025, 10:43 |

    1.    Сповіщення обробляється у фоновому режимі Firebase SDK, але ви не встановлюєте правильний контекст для звукового сигналу.

        2.    Пріоритет повідомлення може бути недостатнім (хоча у вас стоїть PRIORITY_HIGH).

        3.    FullScreenIntent може бути некоректно реалізований або не потрібний.


    Ось кілька способів вирішити проблему:

    1. Налаштуйте звуковий сигнал


    У вашому методі createNotificationChannel можна додати кастомний звук для каналу:

    val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
    notificationChannel.setSound(soundUri, Notification.AUDIO_ATTRIBUTES_DEFAULT)


    2. Оновіть FullScreenIntent


    Замість null використовуйте PendingIntent для відкриття Activity, якщо це потрібно:

    val intent = Intent(this, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    val pendingIntent = PendingIntent.getActivity(
        this, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

    val notification: Notification = NotificationCompat.Builder(this, channelId)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(title)
        .setContentText(body)
        .setChannelId(channelId)
        .setDefaults(Notification.DEFAULT_ALL)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)
        .setAutoCancel(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setFullScreenIntent(pendingIntent, true) // Важливо!
        .build()

    Це змушує Android відображати сповіщення навіть тоді, коли додаток не запущений.


    3. Переконайтеся, що IMPORTANCE_HIGH


    Канал сповіщень має мати максимальний рівень важливості, як ви вказали:

    notificationChannel.importance = NotificationManager.IMPORTANCE_HIGH


    4. Перевірте дозволи на сповіщення


    Переконайтеся, що у вас є дозвіл POST_NOTIFICATIONS, який потрібен з Android 13. Для пристроїв нижче Android 13 це не потрібно:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.POST_NOTIFICATIONS
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // Запросіть дозвіл
            return
        }
    }


    5. Обробка сповіщень у фоновому режимі


    В Android, коли додаток у фоновому режимі, Firebase передає сповіщення напряму у системний менеджер сповіщень. У такому разі вам потрібно обробляти дані через RemoteMessage.data, якщо використовуються data-сповіщення:

    override fun onMessageReceived(message: RemoteMessage) {
        if (message.data.isNotEmpty()) {
            val title = message.data["title"] ?: "Default Title"
            val body = message.data["body"] ?: "Default Body"
            createNotificationChannel(title, body)
        } else {
            message.notification?.let {
                createNotificationChannel(it.title ?: "Default Title", it.body ?: "Default Body")
            }
        }
    }


    6. Перевірте серверну конфігурацію


    Якщо ви використовуєте Firebase Console для надсилання сповіщень, переконайтеся, що обираєте опцію “High Priority”. Якщо це ваш сервер, у JSON-даних встановіть priority: "high":

    {
      "to": "DEVICE_TOKEN",
      "priority": "high",
      "notification": {
        "title": "Заголовок",
        "body": "Текст повідомлення"
      }
    }


    Після внесення цих змін перевірте додаток. Це має вирішити проблему із фоновими сповіщеннями

  • Роман Наливайко
    5 января 2025, 11:20 |

    При спробі додати 

    "priority" => "high",

    отримую помилку

    { "error": { "code": 400, "message": "Invalid JSON payload received. Unknown name \"priority\" at 'message': Cannot find field.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest", "fieldViolations": [ { "field": "message", "description": "Invalid JSON payload received. Unknown name \"priority\" at 'message': Cannot find field." } ] } ] } }

    image


  • Олександр Некрутенко
    5 января 2025, 11:26 |

    Ось правильний формат для запиту до FCM API: {
      "message": {
        "token": "DEVICE_TOKEN",
        "notification": {
          "title": "Заголовок",
          "body": "Текст повідомлення"
        },
        "android": {
          "priority": "high"
        }
      }
    }

  • Роман Наливайко
    5 января 2025, 11:34 |

    Зараз все по старому: в шторці сповіщення з'являється, але heads-up не відбувається, тобто користувач може дізнатися що було сповіщення лише подивившись в шторці.

    image

    У вас буде час подивитися вихідний код андроїду? Може там щось не доналаштовано? Хоча я дивився всі ті параметри що ви наводили в мене прописані: і NotificationCompat.PRIORITY_HIGH і NotificationManager.IMPORTANCE_HIGH

  • Олександр Некрутенко
    5 января 2025, 14:35 |

    Давайте код - гляну

  • Олександр Некрутенко
    6 января 2025, 9:54 |

    1. Неправильний NotificationChannel


    У вашому коді є правильне створення каналу сповіщень, але перевірте, чи дійсно канал налаштований правильно. Зокрема:

        •    Перевірте, чи використовується IMPORTANCE_HIGH, який дозволяє сповіщенням з’являтися у вигляді heads-up (спливаючих) повідомлень.

        •    Для пробудження екрана потрібно також забезпечити, щоб канал мав дозвіл на порушення режиму “Не турбувати”. Ви вже викликаєте setBypassDnd(true), але цього недостатньо — на деяких пристроях це потребує явного дозволу від користувача.


    Рішення: Додайте код для перевірки та явного дозволу для обходу режиму DND:

    if (!notificationManager.areNotificationsEnabled()) {
        // Направляємо користувача до налаштувань
        val intent = Intent(android.provider.Settings.ACTION_APP_NOTIFICATION_SETTINGS)
            .putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, packageName)
        startActivity(intent)
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = notificationManager.getNotificationChannel(channelId)
        if (channel != null && !channel.canBypassDnd()) {
            val intent = Intent(android.provider.Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
                .putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, packageName)
                .putExtra(android.provider.Settings.EXTRA_CHANNEL_ID, channelId)
            startActivity(intent)
        }
    }


    2. setFullScreenIntent


    Ваш setFullScreenIntent налаштований на null, що може не спрацьовувати для heads-up повідомлень або пробудження екрану.


    Рішення: Використовуйте реальний PendingIntent:

    val fullScreenIntent = Intent(this, MainActivity::class.java)
    val fullScreenPendingIntent = PendingIntent.getActivity(
        this, 0, fullScreenIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

    val notification: Notification = NotificationCompat.Builder(this, channelId)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(title)
        .setContentText(body)
        .setChannelId(channelId)
        .setDefaults(Notification.DEFAULT_ALL)
        .setCategory(NotificationCompat.CATEGORY_CALL)
        .setAutoCancel(true)
        .setOnlyAlertOnce(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH) // heads-up
        .setFullScreenIntent(fullScreenPendingIntent, true) // Важливо
        .build()

    3. Специфіка пристрою


    Деякі пристрої, такі як Xiaomi, Huawei, Oppo, мають власні обмеження на показ сповіщень:

        •    Фонова активність: Переконайтесь, що ваш додаток має дозвіл на запуск у фоновому режимі.

        •    Автоматична оптимізація батареї: Відключіть оптимізацію батареї для вашого додатку через налаштування пристрою.


    Код для вимкнення оптимізації батареї:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val intent = Intent(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
        intent.data = Uri.parse("package:$packageName")
        startActivity(intent)
    }

    4. Налаштування екрану


    Перевірте, чи дозволяє пристрій пробуджувати екран від сповіщень. Додайте це до коду:

    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    if (!powerManager.isInteractive) {
        val wakeLock = powerManager.newWakeLock(
            PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
            "app:WakeLock"
        )
        wakeLock.acquire(3000) // Пробудження на 3 секунди
    }

    5. Додаткова перевірка дозволів


    На Android 13 і вище потрібні дозволи для відображення heads-up сповіщень.


    Переконайтесь, що дозволи POST_NOTIFICATIONS та USE_FULL_SCREEN_INTENT видані:

    ActivityCompat.requestPermissions(this, arrayOf(
        Manifest.permission.POST_NOTIFICATIONS
    ), 100)


    android:exported


    Ви встановили android:exported="false". Це означає, що цей сервіс може бути викликаний тільки вашим додатком, а не іншими програмами або системою.


    Для Firebase Cloud Messaging (FCM) сервіс має бути доступним системі Firebase, тому android:exported має бути встановлено у true.

  • Володимир Ковальчук
    5 января 2025, 11:30 |

    Ви отримуєте сповіщення, коли додаток не запущений? Чи тільки тоді, коли він запущений?


    Є рішення для обох випадків…

  • Роман Наливайко
    5 января 2025, 11:35 |

    Сповіщення приходять, але непомітно, тобто вони в шторці з'являються без видимого "вилітання" вгорі екрану (heads-up)

  • Володимир Ковальчук
    5 января 2025, 12:17 |

    Які пермішини є в маніфесті?

  • Роман Наливайко
    5 января 2025, 12:34 |

    image


  • Dmitry K.
    5 января 2025, 15:37 |

    Здравствуйте, вы хотите, чтобы экран пробуждался, когда приходит уведомления? 

  • Dmitry K.
    5 января 2025, 15:43 |

    Есть решение, ставка 1500

  • Роман Наливайко
    5 января 2025, 16:13 |

    Дорого, давайте за 500 грн як в задачі ))

    Пуши в мене працюють, треба тільки щоб вони вспливали коли додаток згорнутий.

    Напевно десь якийсь параметр треба написати і все. Тим паче якщо ви вже це робили то у вас це не займе багато часу.

  • Dmitry K.
    5 января 2025, 16:57 |

    Напишите в лс пожалуйста 

Актуальные фриланс-проекты в категории Разработка под Android

Нужен человек, который сейчас физически в Японии

Нужно протестировать открытие ссылки и записать экран смартфона. Ничего сложного. Любой сможет это сделать.

Разработка под AndroidТестирование и QA ∙ 1 день 16 часов назад ∙ 3 ставки

Скрипт для модификации APK

У меня есть скрипт под старые версии APK Minecraft, который позволял делать версию игры с более меньшим весом за счет того, что там удалялась музыка. Также, скрипт делал клон Minecraft (чтобы можно было иметь две игры майнкрафт на своем устройстве...), а также во вкладку…

JavaРазработка под Android ∙ 2 дня 2 часа назад ∙ 12 ставок

Необходимо разработать мобильное приложение для Android и iOS

Необходимо разработать мобильное приложение для Android и iOS, которое будет работать как мессенджер с нашим AI через готовый Backend и API.Функционал: авторизация; список AI-ассистентов; чат; отправка и получение сообщений; поддержка WebSockets (диалог в реальном времени);…

Разработка под AndroidРазработка под iOS (iPhone и iPad) ∙ 3 дня 12 часов назад ∙ 43 ставки

Трансформация сайта intebwio на платформы: android, ios, windows, linux 5000$

223 588 UAH

Привет! Я ищу опытного программиста, команду или агентстводля комплексного переноса моей инновационной веб-платформы Intebwio напосвященные приложения для систем: Android, iOS, Windows и Linux.О продукте: Intebwio — это основанный на искусственном интеллектебраузер/поисковик…

Разработка под AndroidРазработка под iOS (iPhone и iPad) ∙ 3 дня 14 часов назад ∙ 19 ставок

Разработчик Ton Blockchain 10000 $

447 283 UAH

Здравствуйте! Я ищу фрилансера-разработчика TON для [краткосрочного / долгосрочного] проекта. Мне нужен кто-то, кто может помочь мне с [конкретно укажите, что вам нужно, например, написание смарт-контракта для стейкинга / подключение фронтенда к TonConnect / создание токена].…

Разработка под Android ∙ 3 дня 21 час назад ∙ 15 ставок

Заказчик
Проект опубликован
1 год назад
94 просмотра
Метки