Как правильно позвонить по телефону в Котлин? - PullRequest
0 голосов
/ 26 мая 2018

Я попытался вызвать телефонный разговор на Kotlin, например:

 imgPhone.setOnClick {
            val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "1122334455"))
            startActivity(intent)
        }

При нажатии на изображение телефона ничего визуально не происходит.Оказывается, отладчик показал вам это:

java.lang.SecurityException: Отказ в разрешении: запуск Intent {act = android.intent.action.CALL dat = tel: xxxxxxxxxx cmp = com.android.server.telecom / .components.UserCallActivity}

Я пробовал несколько решений:

  1. Поместите эту строку в AndroidManifest.xml:

<использует-разрешение android: name = "android.permission.CALL_PHONE" />

Добавить android: exported = "true" в операции, для которой вызывается намерение вызова:

< activity android:name=".activities.ProfileActivity" android:exported="true"/>

Спросите разрешение явно:

override fun onCreate() {
super.onCreate()
/*
more codes here
*/
setupPermissions()
 }

fun setupPermissions() {
val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)

    if (permission != PackageManager.PERMISSION_GRANTED) {
    Log.i("Error", "Permission to call denied")
    }
}

Пока что ни один из этих обходных путей не работает (на Android 6).То же исключение SecurityException по-прежнему происходит.Каково правильное решение, тогда?

1 Ответ

0 голосов
/ 26 мая 2018

В Marshmallow вы должны запросить разрешение во время выполнения, просто в манифесте недостаточно.На варианте (3) вы написали, вы почти сделали это.Там вы только проверяете разрешение, но не запрашиваете его.

Официальные документы таковы: https://developer.android.com/training/permissions/requesting

Код будет примерно таким:

fun checkPermission() {
   if (ContextCompat.checkSelfPermission(this,
           Manifest.permission.CALL_PHONE)
           != PackageManager.PERMISSION_GRANTED) {

       // Permission is not granted
       // Should we show an explanation?
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.CALL_PHONE)) {
           // Show an explanation to the user *asynchronously* -- don't block
           // this thread waiting for the user's response! After the user
           // sees the explanation, try again to request the permission.
       } else {
           // No explanation needed, we can request the permission.
           ActivityCompat.requestPermissions(this,
                   arrayOf(Manifest.permission.CALL_PHONE),
                   42)
       }
   } else {
       // Permission has already been granted
       callPhone()
   }
}

override fun onRequestPermissionsResult(requestCode: Int,
        permissions: Array<String>, grantResults: IntArray) {
    if (requestCode == 42) {
            // If request is cancelled, the result arrays are empty.
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // permission was granted, yay!
                callPhone()
            } else {
                // permission denied, boo! Disable the
                // functionality
            }
            return
        }
}

fun callPhone(){
        val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "1122334455"))
        startActivity(intent)
}

И не забывайте, что вам также нужно это в манифесте.И вы можете удалить это из своей деятельности, это бессмысленно.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...