0

I developing an application that receives a push notification when there is an emergency alert and needs to play a sound even when the device is in silent mode.

the sound aslo need to be custom.

I tried all kinds of ways without any success.

How do you do it on Android?

@AndroidEntryPoint
class AlertFirebaseMessagingService : FirebaseMessagingService() {

    companion object {
        private const val CHANNEL_ID = "HEADS_UP_NOTIFICATION"
    }

    @Inject
    lateinit var dbRepository : DBRepositoryImpl

    @Inject
    lateinit var networkRepository : RepositoryImpl

    override fun onNewToken(token : String) {
        super.onNewToken(token)
        Log.d("hofitTest", token)
        AppSharedPreferences.saveToken(token)
        if (AppSharedPreferences.getPhoneNumber().isEmpty().not()) {
            sendRegistrationToServer(token)
        }
    }

    // The method is called every time it receives a notification from Firebase.
    @RequiresApi(Build.VERSION_CODES.O)
    override fun onMessageReceived(
        remoteMessage : RemoteMessage) { 

        Log.d("hofitTest", "From: ${remoteMessage.from}")

        if (remoteMessage.data.isNullOrEmpty().not()) {

            val type = remoteMessage.data["type"] ?: "1"

            sendNotification(
                remoteMessage.data["title"] ?: "", remoteMessage.data["body"] ?: "", type)
            Log.d("hofitTest", "Message data payload: ${remoteMessage.data}")
        }
//        } else if(remoteMessage.notification != null){
//            //TODO change def 1
//            sendNotification(remoteMessage.notification?.title ?: "", remoteMessage.notification?.body ?: "", "1")
//        }
        super.onMessageReceived(remoteMessage)
    }

    private fun sendNotification(title : String, body : String, type : String) {
        createChannel()
        val notification = NotificationCompat.Builder(this, CHANNEL_ID)
        notification.setContentTitle(title)
        notification.setContentText(body)
        notification.priority = NotificationCompat.PRIORITY_HIGH
        val intent = Intent(this, SplashActivity::class.java)
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)
        notification.setSmallIcon(R.drawable.icon_lifeguard_orange_rounded)
        notification.color = ContextCompat.getColor(this, R.color.orange)
        notification.setContentIntent(pendingIntent)
        notification.setAutoCancel(true)
        NotificationManagerCompat.from(this).notify(Random.nextInt(), notification.build())

        CoroutineScope(Dispatchers.IO).launch {
            dbRepository.saveEvent(
                NotificationAlert(name = title ?: "", body = body ?: "", type = type, date = Date().time))
                a()
        }
    }


    private fun createChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                CHANNEL_ID, "Heads Up Notification", NotificationManager.IMPORTANCE_HIGH)
            channel.enableLights(true)
            channel.enableVibration(true)
            channel.lightColor = Color.BLUE
            channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
            getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
        }
    }
}

use RingtoneManager - this not works in silent mode

try {
    val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
    val r = RingtoneManager.getRingtone(LifeguardApplication.context, notification)
    r.play()
} catch (e : Exception) {
    e.printStackTrace()
}


0 Answers0