Search code examples
androidkotlinnotificationsandroid-vibrationincoming-call

Incoming Phone Call notification has no ringtone sound or vibration


Method to create a Notification Channel

private fun createChannel(notificationManager: NotificationManager) {
        val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
        val audioAttributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .setLegacyStreamType(AudioManager.STREAM_RING)
            .build()
        val incomingPhoneCallChannel = NotificationChannel(
            mNotificationManager.INCOMING_PHONE_CALL_CHANNEL_ID, "Incoming phone call",
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            setSound(uri, audioAttributes)
            vibrationPattern = mNotificationManager._VIBRATION_PATTERN
            enableVibration(true)
        }
        notificationManager.createNotificationChannel(incomingPhoneCallChannel)
    }

Method to notify about the call

override fun notify(context: Context) {
        val notificationManager = mNotificationManager.notificationManager
            val notificationChannel = notificationManager.getNotificationChannel(mNotificationManager.INCOMING_PHONE_CALL_CHANNEL_ID)?: createChannel(notificationManager)
            val contentTitle = "Incoming Call"
            val contentIntent = Intent(context, PhoneCallReceiver::class.java)
            val pendingIntent =
                PendingIntent.getBroadcast(context, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE)

            val ringtone =RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
            var builder = NotificationCompat.Builder(
                context,
                mNotificationManager.INCOMING_PHONE_CALL_CHANNEL_ID
            )
                .setContentTitle(contentTitle)
                .setContentIntent(pendingIntent)
                .setContentText("phone call")
                .setColor(ContextCompat.getColor(context, R.color.ic_launcher_background))
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.ic_phone_black_24dp)
                .setOngoing(true)
                .setSound(ringtone)
            builder.setVibrate(mNotificationManager._VIBRATION_PATTERN
            val notification = builder.build()
            notification.flags = Notification.FLAG_INSISTENT
            notificationManager.notify("Incoming Call", mId, notification)
    }

The above code does give me notification with a default notification that sounds like a single "TING!!". It doesn't change the sound even if I select different Ringtones from the notification channel settings and doesn't vibrate at all.


Solution

  • It was not the error in code posted above && works fine. But somewhere else, the AudioManager mode was set to MODE_IN_COMMUNICATION before the incoming call was accepted. This will make the android audio system to behave like you are already in a VOIP audio/video call. Hence just the "TING!!" and no vibration. Changing the AudioManager mode to MODE_NORMAL before the call was accepted worked for me.