Android踩坑小记-在onResume中申请权限
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()
中请求权限的代码循环执行。
为什么会循环执行?
因为在申请权限的时候会弹出这样一个框:
当弹出这个框的时候会调用当前界面的 onPause()
方法(Activity并没有被完全遮挡),当这个框消失的时候会重新调用 onResume()
方法,这样当用户拒绝的时候,就会一直触发申请权限的逻辑。
解决办法
不要在onResume
方法做申请权限的逻辑,可以放到onCreate
或别的方法,做检查权限的逻辑是可以的。