android 权限常见错误,onRequestPermissionsResult回调不执行问题

今天在调试一个fragment时,申请到权限,然后在权限回调里面做相应的dialog提示用户,但是发现一直无弹窗。

话不多说,直接上问题代码

    private void testRxPermissions() {
        ActivityCompat.requestPermissions(this.getActivity(), new String[]{Manifest.permission.CAMERA}, 100);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //TODO:dialog展示相关代码
    }

问题现象: dialog展示相关代码一直未执行,最后打了断点,发现onRequestPermissionsResult函数根本没有进来

问题原因:

问题根因在于,我们调用的是ActivityCompat.requestPermissions,而点进去看一下这个方法的源码

android 权限常见错误,onRequestPermissionsResult回调不执行问题_第1张图片

大家知道原因了吧,所以回调会直接到activity的onRequestPermissionsResult方法中。

问题解决方法:

既然知道了原因,那么解决方法就对应的有两个

解决方法1

最直接的方法,就是统一在fragment所属的activity onRequestPermissionsResult中,处理权限申请回调

解决方法2

既然知道了问题原因,那么我们也可以直接调用fragment中的requestPermissions方法,保证onRequestPermissionsResult回调在fragment中

private void testRxPermissions() {
        requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

解决办法3android 权限常见错误,onRequestPermissionsResult回调不执行问题_第2张图片

仔细看fragment api注释,发现已经requestPermissions废弃,官方建议使用registerForActivityResult

Deprecated
use registerForActivityResult(ActivityResultContract, ActivityResultCallback) passing in a androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions object for the ActivityResultContract and handling the result in the callback.
官方建议使用registerForActivityResult

 ActivityResultLauncher activityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<Boolean>() {
            @Override
            public void onActivityResult(Boolean isGranted) {
                if (isGranted) {
                    //做后续操作
                } else {
                    // 权限被拒绝就要提醒
                }

            }
        });
        activityResultLauncher.launch(Manifest.permission.CAMERA);

总结

建议使用方法3,毕竟是官方建议的,但是如果简单而且防止出错的话,方法1的确是最简单的。

你可能感兴趣的:(Android开发中常见错误,Android随笔,android,java,开发语言)