2015-09-29 6 views
9

ユーザがで実行時アクセス権を拒否した場合再度尋ねないでくださいこれは、今後同じアクセス権を要求する機能を無効にしますか?その許可を有効にするには、ユーザーは設定を通過する必要がありますか?私のアプリケーションで実行時アクセス許可を求めるときに[再度確認しない]チェックボックスをオンにすると、今後のダイアログが無効になりますか?

、私は

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0)

呼び出し、その許可が以前が確認され、再び尋ねることはありません、それがすべてのダイアログボックスが表示されませんで拒否されています。これは期待される行動ですか?

答えて

10

これは正常な動作です。 the documentationから

システムが権限を付与するようにユーザーに要求すると、ユーザーは再びその許可を求めるしないシステムを伝えるのオプションがあります。その場合、アプリがrequestPermissions()を使用してその許可をもう一度尋ねると、システムは即座に要求を拒否します。システムはonRequestPermissionsResult()コールバックメソッドを呼び出し、ユーザーが明示的に要求を拒否した場合と同じ方法でPERMISSION_DENIEDを渡します。つまり、requestPermissions()に電話すると、ユーザーとの直接的なやりとりが発生したと想定することはできません。

+0

の下に使用し、私は可能性がどのようにメッセージが場合にのみ、決してどのような方法がありますもう一度尋ねる? – David

+1

その情報は、残念ながら、露出していません。 –

14

はい、それは無効になります。 しかし、ユーザーが再び要求しないようにいくつかのアクセス許可を設定しているかどうかを検出するために何かを行うことができます。あなたはonRequestPermissionsResult()方法私はGitHubの上で、このようなcontition hereを処理するための許可のためのヘルパーライブラリを用意しています

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    for(String permission: permissions){ 
      if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){ 
       //denied 
       Log.e("denied", permission); 
      }else{ 
       if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){ 
        //allowed 
        Log.e("allowed", permission); 
       } else{ 
        //set to never ask again 
        Log.e("set to never ask again", permission); 
        //do something here. 
       } 
      } 
     } 
} 

でそれを確認することができます。

5

はいJames McCrackenこれが予想される動作です。また、ユーザーがNever Again Againを選択した場合、そのリクエストのアクセス許可ダイアログを開くことはできません。しかし、ユーザーに情報を表示することができます。

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case REQUEST_CODE: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show(); 
        // do your work here 
       } else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) { 
        Toast.makeText(MainActivity.this, "Go to Settings and Grant the permission to use this feature.", Toast.LENGTH_SHORT).show(); 
        // User selected the Never Ask Again Option 
       } else { 
        Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); 
       } 
       break; 
     } 
    } 

そして、あなたは、ユーザーの後に設定画面を開きたい場合は、選択したオプションを「再び尋ねることはありません」、コード

Intent i = new Intent(); 
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
i.addCategory(Intent.CATEGORY_DEFAULT); 
i.setData(Uri.parse("package:" + context.getPackageName())); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
context.startActivity(i); 
関連する問題