·  阅读

如果在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()
}复制代码