2017-01-04 11 views
1

私は、アンドロイドランタイムパーミッションを求めるデモアプリケーションに取り組んでいます マシュマロウ。私はちょうどユーザーが再度許可のユーザーを拒否した場合、再度警告ダイアログを表示するか、少なくとも5回クリックします。彼が5つ以上の時間を拒否した場合、アプリケーションは停止します。警告ダイアログを繰り返し表示するには、いずれかのユーザーが[OK]をクリックしますか?

protected void onCreate(Bundle savedInstanceState) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ActionBar actionBar = getSupportActionBar(); 
     if(null != actionBar){ 
      actionBar.hide(); 
     } 
     if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_INTERNET); 
     } 
     htmlWebView = (WebView)findViewById(R.id.webView); 
     assert htmlWebView != null; 
     WebSettings webSetting = htmlWebView.getSettings(); 
     webSetting.setJavaScriptEnabled(true); 
     webSetting.setDisplayZoomControls(true); 
     htmlWebView.setWebViewClient(new CustomWebViewClient()); 
     htmlWebView.loadUrl("https://inducesmile.com/blog"); 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == REQUEST_INTERNET) { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED 
        ) { 
       //start audio recording or whatever you planned to do 
      }else if (grantResults[0] == PackageManager.PERMISSION_DENIED){ 
       if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.RECORD_AUDIO)) { 
        //Show an explanation to the user *asynchronously* 
        final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.setMessage("This permission is important to record audio.") 
          .setTitle("Important permission required"); 
        builder.setNegativeButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 

          ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_INTERNET); 
          dialog.dismiss(); 

         } 
        } 
        ); 

        builder.show(); 

        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_INTERNET); 

       }else{ 
        //Never ask again and handle your app without permission. 
       } 
      } 
     } 
    } 

ありがとうございました。

+0

それは偉大な方法ではありません。可能であれば、繰り返しのダイアログを避けてください。 –

+0

はい、しかし、私はアプリケーションでそれが必要です。 – Champandorid

答えて

1

は、このコードを試してみてください。

int count =0; 

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_INTERNET: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //do your task here 

      } else { 
       permission_denied(); 
      } 
      break; 
     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

public void permission_denied() { 
    // permission was not granted 
    //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission 
    // shouldShowRequestPermissionRationale will return true 
    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 
      Manifest.permission.RECORD_AUDIO)) { 
     showDialogOK("This permission is important to record audio.", 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         switch (which) { 
          case DialogInterface.BUTTON_POSITIVE: 
           //user enables permisssion do your task.. 
           break; 
          case DialogInterface.BUTTON_NEGATIVE: 
           // proceed with logic by disabling the related features or quit the app. 
           if(count==5){ 
            finish(); 
            //finish activity 
            } 
           else{ 
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_INTERNET); 
            ++count; 
           } 
           break; 
         } 
        } 
       }); 
    } //permission is denied (and never ask again is checked) 
    //shouldShowRequestPermissionRationale will return false 
    else { 
     Toast.makeText(getApplicationContext(), "Go to settings and enable record audio permissions", Toast.LENGTH_LONG).show(); 
    } 
} 


private void showDialogOK(String message, DialogInterface.OnClickListener okListener) { 
    new AlertDialog.Builder(Mainactivity.this) 
      .setMessage(message) 
      .setPositiveButton("OK", okListener) 
      .setNegativeButton("Cancel", okListener) 
      .create() 
      .show(); 
} 

ユーザープレスNever ask again場合..許可ダイアログがこれは動作が期待され、再び

は表示されません。

From the documentation:

システムが権限を付与するようにユーザーに要求すると、ユーザーは再びその許可を求めるしないシステムを伝えるの オプションがあります。その場合、 の場合、アプリケーションがrequestPermissions()を使用して再度 権限を要求すると、システムは直ちにその要求を拒否します。 システムでは、onLequestPermissionsResult()コールバックメソッドが呼び出され、 が明示的にリクエストを拒否した場合と同じ方法で、 がPERMISSION_DENIEDになります。これは、 requestPermissions()を呼び出すと、ユーザとの直接的なやりとりが行われているとはみなせないことを意味します。

はこのも参照してください。繰り返し、何のための警告ダイアログをユーザーに尋ねることの許可または卑しい仕事であるに Does checking the Never ask again box when asking for a runtime permission disable future dialogs?

+0

例外を取得する: 原因:java.lang.IllegalStateException:このアクティビティでTheme.AppCompatテーマ(または子孫)を使用する必要があります。 – Champandorid

+0

getApplicationContext()をthis ... @ Champandoridに変更してみてください。 – rafsanahmad007

+0

作業はうまくいきましたが、ユーザーがチェックボックスをオンにしたときに彼はアプリケーションに入ることができます。 あなたの貴重な時間に感謝します。 – Champandorid

関連する問題