我遇到了android权限的一些问题。问题是onResume每次调用onRequestPermissionsResult时都会被调用,即使用户已经说过"再也不要问"。
一个例子:
@Override
public void onResume() {
super.onResume();
startLocationProvider();
}
private void startLocationProvider() {
if ( !locationService.requestLocationPermission( this, 0 ) ) {
return;
}
@Override
public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults ) {
if ( requestCode == 0 ) {
if ( grantResults.length == 1 && grantResults[ 0 ] == PackageManager.PERMISSION_GRANTED ) {
startLocationProvider();
}
}
一直工作正常,直到用户选择"永不再问及#34;并否认。虽然没有向用户显示任何对话框,但我不知道为什么会一次又一次地调用onResume。
答案 0 :(得分:2)
在检查权限后,您需要使用shouldShowRequestPermissionRationale作为条件检查的一部分。
调用onResume以允许您对该权限检查的结果进行采样。
以下是我正在处理的项目的内容:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
pickDownloadFolder();
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
// Permission Denied
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
result = "PERMISSION_DENIED";
Intent returnIntent = new Intent();
returnIntent.putExtra(resultKey, result);
setResult(RESULT_CANCELED, returnIntent);
finish();
} else {
result = "PERMISSION_DENIED_FORCED";
Intent returnIntent = new Intent();
returnIntent.putExtra(resultKey, result);
setResult(RESULT_CANCELED, returnIntent);
finish();
}
}
}
}
答案 1 :(得分:1)
您是否尝试过将权限请求移至onStart而非onResume?
答案 2 :(得分:0)
由于权限对话框导致您的活动被暂停,因此onResume
被调用。
正确的事件链如下:
- 中致电
您在活动的 onCreate
requestPermissions
requestPermissions
开始在另一个线程中运行,因为它是 设计为不阻止UI线程。因此,您的活动需要依次经过 onStart 和 onResume权限请求将生成一个对话框,该对话框将触发 在活动上 onPause ,因为它不再处于前台位置。
当前活动已暂停,您可以看到一个对话框 要求允许或拒绝许可。
您做出选择,对话框得到解决,并且 onResume 是 调用了Activity。
还请注意,对话框始终会在对话框后触发 onPause
onStart 和 onResume ,无论执行其中的代码需要花费多长时间。 现在您还可以了解为什么不应该将requestPermissions放入 onResume 。