为什么在onRequestPermissionsResult之后调用onResume?

时间:2016-02-04 15:57:30

标签: permissions android-6.0-marshmallow

我遇到了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。

3 个答案:

答案 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)

根据Simone's answer

由于权限对话框导致您的活动被暂停,因此onResume被调用。

  

正确的事件链如下:

     
      
  1. 您在活动的 onCreate

  2. 中致电requestPermissions   
  3. requestPermissions开始在另一个线程中运行,因为它是       设计为不阻止UI线程。因此,您的活动需要依次经过 onStart onResume

  4.   
  5. 权限请求将生成一个对话框,该对话框将触发       在活动上 onPause ,因为它不再处于前台位置。

  6.   
  7. 当前活动已暂停,您可以看到一个对话框       要求允许或拒绝许可。

  8.   
  9. 您做出选择,对话框得到解决,并且 onResume 是       调用了Activity。

  10.   
     

还请注意,对话框始终会在对话框后触发 onPause    onStart 和 onResume ,无论执行其中的代码需要花费多长时间。

     

现在您还可以了解为什么不应该将requestPermissions放入    onResume