Android 6.0 multiple permissions

后端 未结 22 2232
太阳男子
太阳男子 2020-11-22 03:58

I know that Android 6.0 has new permissions and I know I can call them with something like this

if (ContextCompat.checkSelfPermission(this, Manifest.permiss         


        
22条回答
  •  不要未来只要你来
    2020-11-22 04:20

    The following methodology is about

    • asking permissions dynamically ;
    • showing a AlertDialog if the user denies any permission
    • looping until the user accepts permission(s)

    Create a "static" class for permissions methods

    public class PermissionsUtil {
        public static final int PERMISSION_ALL = 1;
    
        public static boolean doesAppNeedPermissions(){
            return android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
        }
    
        public static String[] getPermissions(Context context)
                throws PackageManager.NameNotFoundException {
            PackageInfo info = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_PERMISSIONS);
    
            return info.requestedPermissions;
        }
    
        public static void askPermissions(Activity activity){
            if(doesAppNeedPermissions()) {
                try {
                    String[] permissions = getPermissions(activity);
    
                    if(!checkPermissions(activity, permissions)){
                        ActivityCompat.requestPermissions(activity, permissions,
                                PERMISSION_ALL);
                    }
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static boolean checkPermissions(Context context, String... permissions){
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null &&
                    permissions != null) {
                for (String permission : permissions) {
                    if (ContextCompat.checkSelfPermission(context, permission) !=
                            PackageManager.PERMISSION_GRANTED) {
                        return false;
                    }
                }
            }
            return true;
        }
    }
    

    In MainActivity.java

        private void checkPermissions(){
            PermissionsUtil.askPermissions(this);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case PermissionsUtil.PERMISSION_ALL: {
    
                    if (grantResults.length > 0) {
    
                        List indexesOfPermissionsNeededToShow = new ArrayList<>();
    
                        for(int i = 0; i < permissions.length; ++i) {
                            if(ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                                indexesOfPermissionsNeededToShow.add(i);
                            }
                        }
    
                        int size = indexesOfPermissionsNeededToShow.size();
                        if(size != 0) {
                            int i = 0;
                            boolean isPermissionGranted = true;
    
                            while(i < size && isPermissionGranted) {
                                isPermissionGranted = grantResults[indexesOfPermissionsNeededToShow.get(i)]
                                        == PackageManager.PERMISSION_GRANTED;
                                i++;
                            }
    
                            if(!isPermissionGranted) {
    
                                showDialogNotCancelable("Permissions mandatory",
                                        "All the permissions are required for this app",
                                        new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialogInterface, int i) {
                                                checkPermissions();
                                            }
                                        });
                            }
                        }
                    }
                }
            }
        }
    
        private void showDialogNotCancelable(String title, String message,
                                             DialogInterface.OnClickListener okListener) {
            new AlertDialog.Builder(this)
                    .setTitle(title)
                    .setMessage(message)
                    .setPositiveButton("OK", okListener)
                    .setCancelable(false)
                    .create()
                    .show();
        }
    

提交回复
热议问题