【问题标题】:Run time permissions运行时权限
【发布时间】:2018-06-08 06:59:21
【问题描述】:

我正在制作一个需要存储权限的应用程序,我使用requestPermission() 请求权限。这使用户有权从设置中关闭它们,但我希望用户知道有必要授予应用程序基本功能的权限。我希望在用户从设置中禁用应用程序权限时显示此警报对话框。那可能吗?

【问题讨论】:

    标签: android runtime-permissions


    【解决方案1】:

    当用户从设置中禁用应用程序权限时 可能吗?

    很遗憾,这是不可能的。你无法检测到它。您可以做的最好的事情是在使用需要此权限的功能之前检查权限。

    当您的应用处于后台时

    显示一条通知,指示缺少权限。当用户点击通知时:

    • 将他/她重定向到您可以请求许可的活动
    • 将他/她重定向到设置屏幕。

    当您的应用处于前台时

    您可以展示许可理由以突出许可的重要性。 Android 提供了一个实用方法,shouldShowRequestPermissionRationale(),如果用户之前拒绝了请求,则返回 true。当此方法返回true时,请说明理由。

    您从设置屏幕看到对话框的原因

    您看到该对话框是因为您要为其禁用权限的应用程序具有targetSDkversion < Android M。系统已启用兼容模式以在安装时授予权限,但由于应用程序的版本与当前操作系统不兼容,因此会警告用户。

    【讨论】:

    • 有什么办法吗?另一个替代品或图书馆?
    • @ArashHatami 您的意思是在用户与您的应用交互时显示权限?
    • 不...我想要显示权限,甚至从设置中禁用
    • 联系人等安卓系统应用在禁用存储权限时会出现这种提示
    • @ArashHatami 你不能。最好的办法是定期检查权限并显示通知以指示启用权限
    【解决方案2】:

    存储许可请求示例

    请求许可

    private int STORAGE_PERMISSION = 1;
    private AlertDialog alertDialog;
    
    if (!(ActivityCompat.checkSelfPermission(LauncherActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
                ActivityCompat.requestPermissions(LauncherActivity.this, new
          String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION);
    }
    

    请求许可后。 Activity 会返回这个方法

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == STORAGE_PERMISSION && (ActivityCompat.checkSelfPermission(LauncherActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)){
         // when user denied the permission
         // show dialog to user that the permission is mandatory and add positiveButton. inside the button recall permission check.
    
                alertDialog();
      }
    }
    

    负责警告对话框的方法

    private void alertDialog(){
    
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
    
        builder.setTitle("your title").setMessage("your message for user to request to accept permissions");
            builder.setPositiveButton("Accept", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!(ActivityCompat.checkSelfPermission(LauncherActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
                        ActivityCompat.requestPermissions(LauncherActivity.this, new
                    String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION);
            }
                }
            });
    
        alertDialog = builder.create();
            alertDialog.show();
    }
    

    【讨论】:

    • 那不是我的问题
    • 您无法使用程序授予权限。用户应授予 . SDK
    • 请检查。答案已编辑,我希望这是您要寻找的东西。如果没有,请解释一下,我可以帮助实现要求。
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2017-10-17
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多