Android踩坑小记-在onResume中申请权限

发布时间 2023-11-29 17:27:57作者: 夜行过客

Android踩坑小记-在onResume中申请权限

最近遇见一个问题,在onResume中申请权限,比如申请定位权限,如下所示:

@Override
    protected void onResume() {
        super.onResume();
        requestPermission();
    }


    @TargetApi(Build.VERSION_CODES.M)
    private void requestPermission(){
        LogUtils.i(TAG," in requestPermission");
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            LogUtils.i(TAG," get location Permission success");
        }else requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},2);
    }

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

进入页面时会弹出一个权限申请弹框,如果点击允许一切正常,如果点击拒绝,会重新弹出权限申请对话框,一直拒绝的话会一直弹出。如果点击拒绝并且不再提醒,不会继续弹框,但是页面返回按钮不响应,观察日志发现onResume()中请求权限的代码循环执行。

为什么会循环执行?

因为在申请权限的时候会弹出这样一个框:

image-20231129172302788

当弹出这个框的时候会调用当前界面的 onPause()方法(Activity并没有被完全遮挡),当这个框消失的时候会重新调用 onResume()方法,这样当用户拒绝的时候,就会一直触发申请权限的逻辑。

解决办法

不要在onResume方法做申请权限的逻辑,可以放到onCreate或别的方法,做检查权限的逻辑是可以的。