【问题标题】:How to show alert dialog repeatedly either user click ok?如何重复显示警报对话框,用户单击确定?
【发布时间】:2017-01-04 19:02:37
【问题描述】:

我正在开发一个在 android 上询问运行时权限的演示应用程序 棉花糖。我只是当用户拒绝权限时,用户再次获得警报对话框或至少五次点击。如果他拒绝超过五次,申请将停止。

 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.
                }
            }
        }
    }

感谢您的帮助。

【问题讨论】:

  • 通过警告对话框反复询问用户任何事情都不是一个好习惯,无论是权限还是琐碎的任务。尽量避免重复对话。
  • 是的,但我需要在应用程序中使用它。

标签: android android-studio android-permissions


【解决方案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() 来请求 再次许可,系统立即拒绝该请求。这 系统调用您的 onRequestPermissionsResult() 回调方法和 通过 PERMISSION_DENIED,就像用户有 再次明确拒绝您的请求。这意味着当您调用 requestPermissions(),您不能假设任何直接交互 与用户发生了。

另请参阅:Does checking the Never ask again box when asking for a runtime permission disable future dialogs?

【讨论】:

  • 获取异常:原因:java.lang.IllegalStateException:您需要在此活动中使用 Theme.AppCompat 主题(或后代)。
  • 尝试将 getApplicationContext() 更改为此...@Champandorid 查看编辑
  • 工作正常,但是当用户选中复选框时,他能够进入应用程序,我希望它会弹出,要么他选中了复选框。并感谢您的宝贵时间。
  • 不工作的应用程序继续。并且对话框不再弹出。
  • @Champandorid 你不能在用户按下后显示对话框不再询问..你可以自动将用户导航到设置...从那里启用权限..这也是不好的用户体验实践
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2012-09-10
  • 1970-01-01
  • 2019-04-21
  • 2023-03-13
相关资源
最近更新 更多