2016-02-04 50 views
7

我遇到了一些与Android权限有关的问题。问题是每次onRequestPermissionsResult被调用时,即使用户已经说过“永远不会再问”,onResume也会被调用。为什么在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被一次又一次地调用,尽管没有向用户显示对话框。

+0

onResume在onRequestPermissionResult之后调用,以允许您的活动考虑用户选择(授予或拒绝的权限)并相应地执行代码。但现在真正的问题是,为什么当用户选中“永不再问”并拒绝一个许可时,onRequestPermissionsResult被无限期调用?如果你发现了什么,请让我知道! –

+0

尝试将代码移出onResume并放入onStart。 –

回答

1

在检查权限后,您需要使用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

您是否尝试过移动您的许可请求的OnStart代替的onResume?

相关问题