Установить разрешение в kotlin

#android #kotlin #camera #android-permissions

#Android #kotlin #камера #android-разрешения

Вопрос:

Когда я нажимаю на свой адаптер, я хочу, чтобы он отображал диалоговое окно, содержащее 3 элемента: take photo , select image или cancel . Если они выберут «сделать снимок», появится диалоговое окно, касающееся разрешения. Когда пользователь нажимает allow кнопку, он сразу переходит к действию камеры.

 mImageListAdapter.mAddImageClickListener = object : ImageListAdapter.AddImageClickListener {
            override fun addImageClicked() {
                val options = arrayOf<CharSequence>("Take Photo", "Choose From Gallery", "Cancel")
                val builder = android.support.v7.app.AlertDialog.Builder(context!!)
                builder.setTitle("Select Option")
                builder.setItems(options) { dialog, item ->
                    if (options[item] == "Take Photo") {
                        if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                            startActivityForResult(intent, CAMERA_CAPTURE)
                            dialog.dismiss()
                        }
                    } else if (options[item] == "Choose From Gallery") {
                        dialog.dismiss()
                        val pickPhoto = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                        startActivityForResult(pickPhoto, REQUEST_IMAGE_GALLERY)
                    } else if (options[item] == "Cancel") {
                        dialog.dismiss()
                    }
                }
                builder.show()
            }
        }
  

Моя проблема сейчас в том, что когда я нажимаю на адаптер, появляется диалоговое окно. Когда я выбираю take photo , появляется диалоговое окно разрешения. Но когда я нажимаю allow кнопку в диалоговом окне разрешения, она не переходит к действию камеры, вместо этого она только закрывает диалоговое окно разрешения.

Где я должен разместить requestPermisson функцию?

Разрешение запроса

  fun requestPermission(permission: String): Boolean {
        val isGranted = ContextCompat.checkSelfPermission(context!!, permission) == PackageManager.PERMISSION_GRANTED
        if (!isGranted) {
            ActivityCompat.requestPermissions(
                activity,
                arrayOf(permission),
                READ_WRITE_STORAGE
            )
        }
        return isGranted
    }
  

Комментарии:

1. вам нужно реализовать IDialogInterfaceOnClickListener и установить для него положительное действие диалога, чтобы предотвратить автоматическое закрытие диалога

2. вы получите результат разрешения в onRequestPermissionsResult.

Ответ №1:

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

 val selectTitle = ""
mImageListAdapter.mAddImageClickListener = object : ImageListAdapter.AddImageClickListener {
    override fun addImageClicked() {
        val options = arrayOf<CharSequence>("Take Photo", "Choose From Gallery", "Cancel")
        val builder = android.support.v7.app.AlertDialog.Builder(context!!)
        builder.setTitle("Select Option")
        builder.setItems(options) { dialog, item ->
            selectTitle = options[item]
            if (options[item] == "Take Photo") {
                dialog.dismiss()
                if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                    startActivityForResult(intent, CAMERA_CAPTURE)
                }
            } else if (options[item] == "Choose From Gallery") {
                dialog.dismiss()
                if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    val pickPhoto = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                    startActivityForResult(pickPhoto, REQUEST_IMAGE_GALLERY)
                }
            } else if (options[item] == "Cancel") {
                dialog.dismiss()
            }
        }
        builder.show()
    }
}


fun requestPermission(title: String,permission: String): Boolean {
    val isGranted = ContextCompat.checkSelfPermission(context!!, permission) == PackageManager.PERMISSION_GRANTED
    if (!isGranted) {
        ActivityCompat.requestPermissions(
                activity,
                arrayOf(permission),
                READ_WRITE_STORAGE
        )
    }
    return isGranted
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == READ_WRITE_STORAGE) {
        if (grantResults.isNotEmpty() amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //permission granted so open camera or gallery based on you click
            if(selectTitle == "Take Photo")
                ActivityCompat.startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), CAMERA_CAPTURE)
            else if(selectTitle =="Choose From Gallery")
                ActivityCompat.startActivityForResult(Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI), REQUEST_IMAGE_GALLERY)
        } else {
            // permission was not granted user choose never option from alert dialog of permission
            if (!ActivityCompat.shouldShowRequestPermissionRationale(context as Activity, permissions[0]))
                showPermissionDialog(context)
        }
    }
}
  

Откроется экран настройки устройства, когда пользователь выберет опцию «Никогда» в диалоговом окне разрешения

 fun showPermissionDialog(mContext: Context) {
            val builder = AlertDialog.Builder(mContext, R.style.Dialog)
            builder.setTitle("Need Permission")
            builder.setMessage(msg)
            builder.setPositiveButton("YES") { dialogInterface, i ->
                dialogInterface.dismiss()
                val intent = Intent()
                intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
                val uri = Uri.fromParts("package", mContext.packageName, null)
                intent.data = uri
                mContext.startActivity(intent)
            }

            builder.setNegativeButton("NO") { dialogInterface, i -> dialogInterface.dismiss() }
            builder.show()
        }
  

Комментарии:

1. когда onRequestPermissionsResult произойдет вызов?

2. когда откроется диалоговое окно разрешения, и после этого, что бы пользователь ни делал, будь то разрешение разрешить или нажать, никогда не спрашивайте снова. Выполните отладку, и вы получите больше идей.

Ответ №2:

Возможно, вам следует реализовать onRequestPermissionsResult метод.

   override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {

    //TODO

    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

}