1、在Mainfest.xml中添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.CAMERA"/>
2、在build.gradle中添加引入Deter的依赖
implementation 'com.karumi:dexter:6.2.3'
3、调用Deter中在运行时申请权限的方法
Dexter.withContext(this).withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
).withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(report : MultiplePermissionsReport?) {
if(report!!.areAllPermissionsGranted()){
Toast.makeText(this@AddUpdateDishActivity,"Camera Clicked",Toast.LENGTH_SHORT).show()
}else{
showRationalDialogForPermissions()
}
}
override fun onPermissionRationaleShouldBeShown(
permissions: MutableList<PermissionRequest>?,
token: PermissionToken?
) {
showRationalDialogForPermissions()
}
}).onSameThread().check()
运行结果:
注:
Deter(用于简化申请运行时权限的操作) github地址:
https://github.com/Karumi/Dexter
AddUpdateDishAcitivity代码:
package com.example.mykotlin1
import android.Manifest
import android.app.AlertDialog
import android.app.Dialog
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.Toast
import com.example.mykotlin1.databinding.ActivityAddUpdateDishBinding
import com.example.mykotlin1.databinding.DialogCustomImageSelectionBinding
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.multi.MultiplePermissionsListener
class AddUpdateDishActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var mBinding : ActivityAddUpdateDishBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityAddUpdateDishBinding.inflate(layoutInflater)
setContentView(mBinding.root)
mBinding.ivAddDishImage.setOnClickListener(this)
mBinding.svContainer.setHorizontalFadingEdgeEnabled(false)
//setupActionBar()
}
private fun setupActionBar(){
val toobar = mBinding.toolbarAddDishActivity
// Log.i("AddUpdateDishActivity",toobar.isEmpty()+"")
setSupportActionBar(mBinding.toolbarAddDishActivity)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
mBinding.toolbarAddDishActivity.setNavigationOnClickListener {
onBackPressed()
}
}
override fun onClick(v: View?) {
when(v!!.id){
R.id.iv_add_dish_image ->{
customImageSelectionDialog()
return;
}
}
}
private fun customImageSelectionDialog(){
val dialog = Dialog(this);
val binding : DialogCustomImageSelectionBinding = DialogCustomImageSelectionBinding.inflate(layoutInflater)
dialog.setContentView(binding.root)
binding.tvCamera.setOnClickListener {
Dexter.withContext(this).withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
).withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(report : MultiplePermissionsReport?) {
if(report!!.areAllPermissionsGranted()){
Toast.makeText(this@AddUpdateDishActivity,"Camera Clicked",Toast.LENGTH_SHORT).show()
}else{
showRationalDialogForPermissions()
}
}
override fun onPermissionRationaleShouldBeShown(
permissions: MutableList<PermissionRequest>?,
token: PermissionToken?
) {
showRationalDialogForPermissions()
}
}).onSameThread().check()
dialog.dismiss()
}
binding.tvGallery.setOnClickListener {
Toast.makeText(this,"Gallery Clicked",Toast.LENGTH_SHORT).show()
Dexter.withContext(this@AddUpdateDishActivity)
.withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
).withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
if(report!!.areAllPermissionsGranted()){
Toast.makeText(this@AddUpdateDishActivity,"You have the Gallery permission now to select image",Toast.LENGTH_SHORT).show()
}
}
override fun onPermissionRationaleShouldBeShown(
permissions: MutableList<PermissionRequest>?,
token: PermissionToken?
) {
showRationalDialogForPermissions()
}
}).onSameThread().check()
dialog.dismiss()
}
dialog.show()
}
private fun showRationalDialogForPermissions(){
AlertDialog.Builder(this).setMessage("It looks like you have turned off permissions " +
"required for this feature.It can be enabled under Application Settings")
.setPositiveButton("GO TO SETTINGS")
{_,_ ->
try{
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package",packageName,null)
intent.data = uri
startActivity(intent)
}catch (e : ActivityNotFoundException){
e.printStackTrace()
}
}.setNegativeButton("Cancel"){dialog,_->
dialog.dismiss()
}.show()
}
}