onRequestPermissionsResult 被无限调用
onRequestPermissionsResult is called infinitely
我正在使用运行时权限请求,但存在问题。好像无限调用了回调方法onRequestPermissionsResult
。因此,当用户拒绝请求时,应用程序无响应..
每次用户单击 'deny' 时,权限对话框都会重新出现。只有点击 "never ask again" 才不会再次出现。
* 按 'allow' 时效果很好 - 没有任何问题。
有什么方法可以取消调用一次后的方法吗?
if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions( this, new String[]{ Manifest.permission.ACCESS_FINE_LOCATION }, LOCATION_PERMISSION_CUSTOM_REQUEST_CODE );
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch( requestCode )
{
case LOCATION_PERMISSION_CUSTOM_REQUEST_CODE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
MyManager.connect();
return;
} else {
// permission denied
return;
}
default:
return;
}
}
正如您在评论中提到的,这里的问题是在 onResume
方法中调用了触发请求权限对话框的代码。
请求对话框权限完成后,运行时会在触发它的 activity 上调用 onResume
,就像任何以对话框为主题的 activity 一样。
在您的情况下,拒绝许可会再次触发对 onResume
的调用,这将再次显示对话框并导致无限循环。
将此权限请求移至 onCreate
或其他流程即可解决您的问题。
我正在使用运行时权限请求,但存在问题。好像无限调用了回调方法onRequestPermissionsResult
。因此,当用户拒绝请求时,应用程序无响应..
每次用户单击 'deny' 时,权限对话框都会重新出现。只有点击 "never ask again" 才不会再次出现。 * 按 'allow' 时效果很好 - 没有任何问题。
有什么方法可以取消调用一次后的方法吗?
if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions( this, new String[]{ Manifest.permission.ACCESS_FINE_LOCATION }, LOCATION_PERMISSION_CUSTOM_REQUEST_CODE );
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch( requestCode )
{
case LOCATION_PERMISSION_CUSTOM_REQUEST_CODE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
MyManager.connect();
return;
} else {
// permission denied
return;
}
default:
return;
}
}
正如您在评论中提到的,这里的问题是在 onResume
方法中调用了触发请求权限对话框的代码。
请求对话框权限完成后,运行时会在触发它的 activity 上调用 onResume
,就像任何以对话框为主题的 activity 一样。
在您的情况下,拒绝许可会再次触发对 onResume
的调用,这将再次显示对话框并导致无限循环。
将此权限请求移至 onCreate
或其他流程即可解决您的问题。