Как правильно получить разрешения на намерение телефонного звонка

Как запросить разрешения с помощью Kotlin.

Я пытаюсь сделать функцию телефонного звонка

fun buChargeEvent(view: View){
    var number: Int = txtCharge.text.toString().toInt()
    val intentChrage = Intent(Intent.ACTION_CALL)
    intent.data = Uri.parse("tel:$number")
    startActivity(intentChrage)
}

Я добавил разрешения пользователя в манифест, но по-прежнему получаю ту же ошибку.


person Muftah Alqabaeli    schedule 11.10.2017    source источник
comment
Возможно, это поможет: developer.android.com/training/permissions/   -  person Héctor    schedule 11.10.2017
comment
Возможный дубликат разрешения среды выполнения запроса Android для вызова действия   -  person jrtapsell    schedule 11.10.2017
comment
почему только тег котлин? наконец добавьте андроид. И ваш вопрос дублирует запросить разрешение   -  person kurt    schedule 12.10.2017


Ответы (5)


Сначала вам нужно добавить разрешение в свой манифест

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

После того, как разрешение добавлено в манифест, следующий код будет работать нормально для вас. «Number_to_call» будет вашим номером, который необходимо заменить.

 val call = Intent(Intent.ACTION_DIAL)
 call.setData(Uri.parse("tel:" +"Number_to_call"))
 startActivity(call)
person arjun shrestha    schedule 31.12.2017

Вам нужно добавить разрешение времени выполнения. Загрузите исходный код отсюда

// Нажмите на функцию макета:

  rl_call.setOnClickListener {
        if (boolean_call) {
            phonecall()
        }else {
            fn_permission(Manifest.permission.CALL_PHONE,CALLMODE)
        }
    }

// Запрос разрешения на ответ

fun fn_permission(permission:String,mode:Int){
    requestPermissions(permission, object : PermissionCallBack {
        override fun permissionGranted() {
            super.permissionGranted()
            Log.v("Call permissions", "Granted")
                boolean_call=true              
                phonecall()        

        }

        override fun permissionDenied() {
            super.permissionDenied()
            Log.v("Call permissions", "Denied")
                boolean_call=false              

        }
    })
}

// функция для вызова намерения

   fun phonecall() {
    val intent = Intent(Intent.ACTION_CALL);
    intent.data = Uri.parse("tel:1234567890s")
    startActivity(intent)
}

Спасибо!

person Deepshikha Puri    schedule 02.01.2018

Сначала вам нужно сначала добавить разрешение на ваш manifest :

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

Этот бит кода используется вместо вашего метода:

fun buChargeEvent(view: View) {
    var number: Int = txtCharge.text.toString().toInt()
    val callIntent = Intent(Intent.ACTION_CALL)
    callIntent.data = Uri.parse("tel:$number")
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this as Activity,
                Manifest.permission.CALL_PHONE)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.CALL_PHONE),
                    MY_PERMISSIONS_REQUEST_CALL_PHONE)
        }
    }
    startActivity(callIntent)
}
person norbel ambanumben    schedule 22.03.2018

Вам необходимо запросить разрешение во время выполнения, поскольку определенные разрешения в Android 6.0 требуют, чтобы вы запрашивали их при установке и снова во время выполнения.

Следуя инструкциям здесь, объясняется, как запросить разрешение. во время выполнения.

person jrtapsell    schedule 11.10.2017

Это полный код для разрешений во время выполнения для Call Phone

Шаг 1: добавьте разрешение в манифест

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

Шаг 2. Вызовите этот метод checkAndroidVersion() в onCreate()

fun checkAndroidVersion() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkAndRequestPermissions()) {
            } else {

            }

        } else {
            // do code for pre-lollipop devices
        }

    }

val REQUEST_ID_MULTIPLE_PERMISSIONS = 1



fun checkAndRequestPermissions(): Boolean {
        val call = ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.CALL_PHONE)
        val listPermissionsNeeded = ArrayList<String>()
        if (call != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CALL_PHONE)
        }

        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this@MainActivity, listPermissionsNeeded.toTypedArray(), REQUEST_ID_MULTIPLE_PERMISSIONS)
            return false
        }
        return true
    }



fun checkAndRequestPermissions(): Boolean {
        val call = ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.CALL_PHONE)
        val listPermissionsNeeded = ArrayList<String>()
        if (call != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CALL_PHONE)
        }

        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this@MainActivity, listPermissionsNeeded.toTypedArray(), REQUEST_ID_MULTIPLE_PERMISSIONS)
            return false
        }
        return true
    }



override fun onRequestPermissionsResult(requestCode: Int,
                                            permissions: Array<String>, grantResults: IntArray) {
        Log.d("in fragment on request", "Permission callback called-------")
        when (requestCode) {
            REQUEST_ID_MULTIPLE_PERMISSIONS -> {

                val perms = HashMap<String, Int>()
                // Initialize the map with both permissions
                perms[Manifest.permission.CALL_PHONE] = PackageManager.PERMISSION_GRANTED
                // Fill with actual results from user
                if (grantResults.size > 0) {
                    for (i in permissions.indices)
                        perms[permissions[i]] = grantResults[i]
                    // Check for both permissions
                    if (perms[Manifest.permission.CALL_PHONE] == PackageManager.PERMISSION_GRANTED
                            ) {
                        print("Storage permissions are required")
                        // process the normal flow
                        //else any one or both the permissions are not granted
                    } else {
                        Log.d("in fragment on request", "Some permissions are not granted ask again ")
                        //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
                        //                        // shouldShowRequestPermissionRationale will return true
                        //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
                        if (ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity, Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)) {
                            showDialogOK("Call  permission is required for this app",
                                    DialogInterface.OnClickListener { dialog, which ->
                                        when (which) {
                                            DialogInterface.BUTTON_POSITIVE -> checkAndRequestPermissions()
                                            DialogInterface.BUTTON_NEGATIVE -> {
                                            }
                                        }// proceed with logic by disabling the related features or quit the app.
                                    })
                        } else {
                            Toast.makeText(this@MainActivity, "Go to settings and enable permissions", Toast.LENGTH_LONG)
                                    .show()
                            //                            //proceed with logic by disabling the related features or quit the app.
                        }//permission is denied (and never ask again is  checked)
                        //shouldShowRequestPermissionRationale will return false
                    }
                }
            }
        }

    }

    fun showDialogOK(message: String, okListener: DialogInterface.OnClickListener) {
        AlertDialog.Builder(this@MainActivity)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", okListener)
                .create()
                .show()
    }
**Step 3**:- On button click
fun buChargeEvent(view: View){
if(checkAndRequestPermissions(){
    var number: Int = txtCharge.text.toString().toInt()
    val intentChrage = Intent(Intent.ACTION_CALL)
    intent.data = Uri.parse("tel:$number")
    startActivity(intentChrage)
}
}
person Quick learner    schedule 06.09.2018