首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从“设置”屏幕授予用户更改权限

从“设置”屏幕授予用户更改权限
EN

Stack Overflow用户
提问于 2017-08-28 09:56:21
回答 2查看 3.5K关注 0票数 6

应用程序需要两个权限

  1. 读电话状态
  2. 摄像头

应用程序的屏幕如下:

Screen A: Splash (根据权限状态处理屏幕导航)

屏幕B:权限屏幕(如果用户没有授予电话权限)

屏幕C:条款和条件

启动时,App将检查是否授予了电话许可。如果获得批准,应用程序将打开屏幕C,否则它将保持在相同的屏幕B。

步骤:

  1. 打开App -> Splash ->权限屏幕
  2. 单击“授予权限”->权限对话框->拒绝权限
  3. 点击“打开设置”
  4. 批准“照相机”许可(不是电话许可)
  5. 点击设备的'Back‘按钮,然后返回到app。
  6. 权限屏幕将显示为不授予'phone'权限。
  7. 再次重复步骤2和3
  8. 现在删除‘相机’许可,并授予‘手机’许可(因为我们已经改变相机权限应用程序进程将被杀死,并重新启动)。
  9. 重复步骤5,飞溅,然后屏幕C(条款和条件)将显示。
  10. 再次点击‘后退’按钮,将显示相同的屏幕C(屏幕C在后台堆栈中有两个实例)

我可以使用'CLEAR_TASK'和'CLEAR_TOP'标志和startActivity,目的是了解当用户更改、设置权限时应用程序发生了什么变化。

Observation:

  1. 当用户授予权限时,我们的应用程序将没有任何效果。
  2. 当用户删除授予的权限时,安卓应用程序将杀死并重新启动应用程序。(如果正在发生这种情况,那么为什么会出现两个T&C屏幕的实例?)

我在这里有点困惑!!

EN

回答 2

Stack Overflow用户

发布于 2017-09-24 07:35:15

@AndiGeeky这里是一些完整的代码,如果选择了允许或拒绝,它就会通知用户,并且它将管理另外两种情况--用户被选中永远不要再问,或者用户在被允许不允许之后是否更改了设置

代码语言:javascript
复制
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            //.... write file into storage ...
            System.out.println("SDK > BuildVersion TRUE");
        } else {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 666);  // Comment 26
            System.out.println("go to requestPermissions");
        }
    }
    onLoad();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {

        case 666: // Allowed was selected so Permission granted
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Snackbar s = Snackbar.make(findViewById(android.R.id.content),"Permission Granted",Snackbar.LENGTH_LONG);
                View snackbarView = s.getView();
                TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
                textView.setTextColor(Color.RED);
                textView.setTextSize(18);
                textView.setMaxLines(6);
                s.show();

                // do your work here

            } else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) {
                // User selected the Never Ask Again Option Change settings in app settings manually
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                alertDialogBuilder.setTitle("Change Permissions in Settings");
                alertDialogBuilder
                        .setMessage("" +
                                "\nClick SETTINGS to Manually Set\n"+"Permissions to use Database Storage")
                        .setCancelable(false)
                        .setPositiveButton("SETTINGS", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package", getPackageName(), null);
                                intent.setData(uri);
                                startActivityForResult(intent, 1000);     // Comment 3.
                            }
                        });

                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.show();

            } else {
                    // User selected Deny Dialog to EXIT App ==> OR <== RETRY to have a second chance to Allow Permissions
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {

                    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                    alertDialogBuilder.setTitle("Second Chance");
                    alertDialogBuilder
                            .setMessage("Click RETRY to Set Permissions to Allow\n\n"+"Click EXIT to the Close App")
                            .setCancelable(false)
                            .setPositiveButton("RETRY", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    //ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Integer.parseInt(WRITE_EXTERNAL_STORAGE));
                                    Intent i = new Intent(MainActivity.this,MainActivity.class);
                                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(i);
                                    }
                            })
                            .setNegativeButton("EXIT", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    finish();
                                    dialog.cancel();
                                }
                            });
                    AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();
                }
            }
            break;
    }};
票数 1
EN

Stack Overflow用户

发布于 2017-08-28 10:08:27

代码语言:javascript
复制
/**** If user changes, permission from settings it will again ask for permission to 
      granted.You should always check if user changes permission from settings
      using below code ***/ 

if(checkSelfPermission(Manifest.permission.your_permission_name) == PackageManager.PERMISSION_GRANTED)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45916310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档