【问题标题】:User changes granted Permission from Settings screen从设置屏幕授予用户更改权限
【发布时间】:2018-02-05 13:33:09
【问题描述】:

应用程序需要两个权限

  1. 读取手机状态
  2. 相机

应用程序有以下屏幕:

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

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

屏幕 C:条款和条件屏幕

当它启动时,应用程序将检查是否授予手机权限。如果授予,应用程序将打开屏幕 C,否则它将保持在同一屏幕 B。

步骤:

  1. 打开应用程序->启动画面->权限屏幕
  2. 点击“授予权限” -> 权限对话框 -> 拒绝权限
  3. 点击“打开设置”
  4. 授予“相机”权限(不是手机权限)
  5. 点击设备的“返回”按钮并返回应用程序。
  6. 权限屏幕将显示为未授予'电话'权限。
  7. 再次重复步骤 #2 和 #3
  8. 现在移除“相机”权限并授予“手机”权限(由于我们更改了相机权限,应用进程将被终止并重新启动)。
  9. 重复第 5 步,将显示启动画面,然后显示屏幕 C(条款和条件)。
  10. 再次点击“返回”按钮,将显示相同的屏幕 C(屏幕 C 在后堆栈中有两个实例)

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

观察:

  1. 当用户授予权限时,我们的申请流程将不起作用。

  2. 当用户删除授予的权限时,Android 应用程序将终止并重新启动应用程序。 (如果发生这种情况,那么为什么会有两个 T&C 屏幕实例?)

我在这里有点困惑!

【问题讨论】:

    标签: android permissions android-permissions


    【解决方案1】:

    @AndiGeeky 这是一些完整的代码,用于通知用户是否选择了“允许”或“拒绝”,它将管理用户选择“不再询问”的另外两个场景,或者用户是否在允许后更改设置为不允许

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

    【讨论】:

    • 我明白了。问题是当用户删除授予的权限时会发生什么? Android 会终止应用程序并重新启动,否则 backstack 将相同?
    • @AndiGeeky 我已经使用了这段代码,它处理了用户编辑权限并将其设置为权限被拒绝的问题 这是处理所有可能性的最聪明和设计良好的代码之一在处理用户可以做出的所有 3 种可能选择时发生
    【解决方案2】:
    /**** 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)
    

    【讨论】:

    • 我明白了。问题是当用户删除授予的权限时会发生什么? Android 会终止应用程序并重新启动,否则 backstack 将相同?
    • Android 将保持跟踪,即使您的应用程序处于后台或终止状态,也会再次请求授予接受的权限
    猜你喜欢
    • 2014-07-26
    • 2019-12-12
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多