vxh.viet
3/21/2016 - 7:08 AM

Android M new runtime Permission

Android M new runtime Permission

Source: StackOverflow, StackOverflow, inTheCheeseFactory

Library: could use hotchemi's PermissionsDispatcher

Answer:

// Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    private static final int REQUEST_PERMISSION_SETTING = 2;
    
    /**
     * Checks if the app has permission to read device storage
     * If the app does not has permission then the user will be prompted to grant permissions
     * @param activity
     */
    public void verifyStoragePermissions(Activity activity) {
        // Check if we have read external storage permission
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            if (! ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                showMessageOKCancel("You need to allow access to External Storage",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(
                                        MainActivity.this,
                                        PERMISSIONS_STORAGE,
                                        REQUEST_EXTERNAL_STORAGE
                                );
                            }
                        });
                return;
            }
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }else{
            selectVideo();
        }
    }
    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(MainActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .create()
                .show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_EXTERNAL_STORAGE:
            {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, do YOUR THING.
                    Log.d(TAG, "permission granted");
                    selectVideo(); //do YOUR THING
                } else {
                    // permission denied. Prompt explanation and open settings so that the user can enable the required permissions
                    Toast.makeText(this, "Some Permission is Denied", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "permission denied");

                    showMessageOKCancel("This app need to access the External Storage to retrieve videos. Please enable Storage in Permissions!",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                                    intent.setData(uri);
                                    startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                                }
                            });
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            if(requestCode == REQUEST_PERMISSION_SETTING){
                selectVideo(); //successfully retrieve the neccessary permission, do YOUR THING
            }
        }
    }