Как закрыть стандартное приложение для звонков, после совершения звонка через вызов Intent.ACTION_DIAL?

Необходимо закрыть стандартное приложения звонилку после осуществления звонка и вернуться в исходную активность.

Метод открытия звонилки:

textViewPhoneValue.setOnClickListener {
        val intent = Intent(Intent.ACTION_DIAL).apply {
            data = Uri.parse("tel:$phone")
        }
        if (intent.resolveActivity(packageManager) != null) {
            startActivity(intent)
        }
    }

Ответы (1 шт):

Автор решения: Alex_Skvortsov

Предлагаю несколько изменить код.

Изменяем onClickListener:

textViewPhoneValue.setOnClickListener {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), MY_PERMISSIONS_REQUEST_CALL_PHONE)
        } else callPhone()
    }

Пояснение: если приложение работает на API 26 и выше, то разрешение CALL_PHONE нужно запрашивать из кода при вызове. Собственно, здесь мы проверяем выдано ли приложению это разрешение, если выдано - просто начинаем звонок, иначе - запрашиваем разрешение.

Сама функция callPhone почти не меняется:

private fun callPhone(number: String = this.phone) {
    val intent = Intent(Intent.ACTION_CALL).apply {
        data = Uri.parse("tel:$number")
    }
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Так как Intent.ACTION_CALL - опасное разрешение, то нужно его вызывать из кода (помимо манифеста), а так же получать результат (в той же активити). Так что переопределяем функцию onRequestPermissionsResult, отвечающую за получение разрешений. Думаю, тут код в пояснениях не нуждается:

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    when (requestCode) {
        MY_PERMISSIONS_REQUEST_CALL_PHONE -> {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                callPhone()
            } else {
                // разрешение от пользователя не получено, необходимо отключить этот функционал
            }
            return
        }
    }
}

Ну и в манифесте указываем:

<uses-permission android:name="android.permission.CALL_PHONE" />

Разрешение спрашивается только 1 раз (при первом вызове звонка).

P.s. MY_PERMISSIONS_REQUEST_CALL_PHONE можно объявить как:

companion object{
    private const val MY_PERMISSIONS_REQUEST_CALL_PHONE = 1
}
→ Ссылка