Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在onRequestPermissionsResult之后调用onResume?_Permissions_Android 6.0 Marshmallow - Fatal编程技术网

为什么在onRequestPermissionsResult之后调用onResume?

为什么在onRequestPermissionsResult之后调用onResume?,permissions,android-6.0-marshmallow,Permissions,Android 6.0 Marshmallow,我在android权限方面遇到了一些问题。问题是每次调用onRequestPermissionsResult时都会调用onResume,即使用户已经说过“不再询问” 例如: @Override public void onResume() { super.onResume(); startLocationProvider(); } private void startLocationProvider() { if ( !locationService.r

我在android权限方面遇到了一些问题。问题是每次调用onRequestPermissionsResult时都会调用onResume,即使用户已经说过“不再询问”

例如:

  @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();
      }
    }

它可以正常工作,直到用户选择“永不再次询问”并拒绝。我不知道为什么会一次又一次地调用onResume,尽管没有向用户显示任何对话框。

在检查权限后,您需要使用shouldShowRequestPermissionRegulation作为条件检查的一部分

调用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();
            }
        }
    }
}

您是否尝试将权限请求移动到onStart而不是onResume?

根据:

调用
onResume
,因为权限对话框导致活动暂停

正确的事件链如下所示:

  • 您可以在活动的onCreate中调用
    requestPermissions

  • requestPermissions
    开始在另一个线程中运行,因为它是 设计为不阻塞UI线程。因此,您的活动经历了onStartonResume

  • 权限请求生成一个对话框,该对话框将激发 暂停活动,因为它不再位于前景位置

  • 此时活动已暂停,您可以看到一个对话框 请求允许或拒绝许可

  • 您做出选择后,对话框将被解析,并且onResume将被关闭 我被邀请参加这次活动

  • 还要注意,onPause由对话框始终在之后触发 onStartonResume活动,无论执行其中的代码需要多长时间

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


    onResume在onRequestPermissionResult之后调用,以允许您的活动考虑用户选择(授予或拒绝权限)并相应地执行代码。但现在真正的问题是,当用户选中“永不再次请求”并拒绝权限时,为什么会无限期地调用onRequestPermissionsResult?如果你发现了什么,请告诉我!尝试将代码从onResume中移出,并移到onStart中。