如果在fragment中请求权限,可能存在不执行 onRequestPermissionsResult方法。
解决:
注意!!!!!
在宿主activity中,一定要重写 onRequestPermissionsResult并且带上下面这句话,不然fragment不回调 onRequestPermissionsResult.
super.onRequestPermissionsResult(requestCode, permissions, grantResults)复制代码
private val permissionName1 = Manifest.permission.SEND_SMS
private val PERMISSIONCODE = 102if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(permissionName1) == PackageManager.PERMISSION_GRANTED) {
//有权限,发送短信
sendSms()
} else {
//没有权限,请求后再发送
//fragment请求权限直接执行下面这个语句,如果是activity中请求权限
//则,ActivityCompat.requestPermissions(this, arrayOf(permissionName1), REQUESTCODE)
requestPermissions(arrayOf(permissionName1), PERMISSIONCODE)
} else {
sendSms()
}复制代码
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSIONCODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//权限申请成功
sendSms()
} else {
if (!shouldShowRequestPermissionRationale(permissionName1)) {
//提示用户前往设置界面自己打开权限
showSnackBar(resources.getString(R.string.permission_open), resources.getString(R.string.setting), View.OnClickListener {
val intent = Intent()
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
val uri = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
intent.data = uri
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
} else {
showSnackBar(resources.getString(R.string.permission_again), resources.getString(R.string.confirm), View.OnClickListener {
requestPermissions(arrayOf(permissionName1), PERMISSIONCODE)
private fun showSnackBar(contentText: String, buttonText: String, listener: View.OnClickListener) {
Snackbar.make(activity!!.findViewById(android.R.id.content),
contentText,
Snackbar.LENGTH_INDEFINITE)
.setAction(buttonText, listener).show()
}复制代码