Search code examples
androidkotlincameraandroid-permissions

Set permision in kotlin


When I click on my adapter I want it to display a dialog which contains 3 items: take photo,select image or cancel. If they select 'take photo', a dialog regarding permission will pop up. When the user clicks allow button, it will straight away go to take camera action.

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()
            }
        }

My issue now is that when I click the adapter, the dialog pops up. When I select take photo, a permission dialog pops up. But when I click allow button in the permission dialog, it doesn't go to take camera action, instead it only closes the permission dialog.

Where should I place the requestPermisson function?

RequestPermission

 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
    }

Solution

  • when permission is granted you can open gallery or camera whatever you want and if not granted we have to ask permission again

    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() && 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)
            }
        }
    }
    

    This will open device setting screen when user chose never option from permission dialog

    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()
            }