在 kotlin 中设置权限
Set permision in kotlin
当我单击我的适配器时,我希望它显示一个包含 3 个项目的对话框:take photo
、select image
或 cancel
。
如果他们 select 'take photo',将弹出一个关于权限的对话框。当用户点击 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()
}
}
我现在的问题是,当我点击适配器时,会弹出对话框。当我selecttake 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
}
获得许可后,您可以随意打开图库或相机,如果未获得许可,我们必须再次请求许可
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()
}
也许,您应该实施 onRequestPermissionsResult
方法。
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
//TODO
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
当我单击我的适配器时,我希望它显示一个包含 3 个项目的对话框:take photo
、select image
或 cancel
。
如果他们 select 'take photo',将弹出一个关于权限的对话框。当用户点击 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()
}
}
我现在的问题是,当我点击适配器时,会弹出对话框。当我selecttake 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
}
获得许可后,您可以随意打开图库或相机,如果未获得许可,我们必须再次请求许可
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()
}
也许,您应该实施 onRequestPermissionsResult
方法。
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
//TODO
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}