2016-02-04 15 views
7

私はアンドロイドの権限にいくつかの問題があります。問題は、onResumeがonRequestPermissionsResultが呼び出されるたびに呼び出されるということです。なぜ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(); 
     } 
    } 

それが正常に動作しますが、ユーザまで、「再び尋ねることはありません」を選択し、拒否します。私は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にあなたの許可申請を移動しようとしたことがありますか?

関連する問題