Handling permissions in one class in android

To handle permissions in android M +, I want to write one class, namely the PermissionHandler class, to handle all permission-related work, so that I can easily use the same class in any project without making changes to the calling activity, invoking only the constructor:

           new PermissionHandler(CallingActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, new PermissionHandler.PermissionGranted() {
                @Override
                public void onPermissionGranted() {
                    doWhatever();
                }
            });

My PermissionHandler:

public class PermissionHandler implements ActivityCompat.OnRequestPermissionsResultCallback{
.
.
.
public PermissionHandler(AppCompatActivity callingActivity, String permission, PermissionGranted permissionGranted) {
        this.permission = permission;
        this.permissionGranted = permissionGranted;
        this.callingActivity= callingActivity;
        askForPermission();

}

private void askForPermission() {

            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
                    showAlertDialog();
                } else {
                    ActivityCompat.requestPermissions(callingActivity,permissionsArray, PERMISSION_REQUEST);
                }
            } else {
                permissionGranted.onPermissionGranted();
            }
}

    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                permissionGranted.onPermissionGranted();
            } else {
                onPermissionIsNotGranted();
            }
            break;
        }
    }
}

My problem is that onRequestPermissionsResultwhich should be called when called ActivityCompat.requestPermissions(callingActivity,permissionsArray, PERMISSION_REQUEST)is never called. I found out that this is due to an android call calling callingActivity.onRequestPermissionsResultthat does not exist in callActivity and passed to PermissionHandler. I also considered using Reflection and Proxies to solve this problem at runtime, but did not succeed.

+4
2
 if (checkPermission(PERMISSION_WRITE_EXTERNAL_STORAGE)) {

            addToneToStorage();

        } else {

            requestForPermission(PERMISSION_WRITE_EXTERNAL_STORAGE);

        }

BaseActivity

public static final int PERMISSION_RECORD_AUDIO = 1;
public static final int PERMISSION_READ_EXTERNAL_STORAGE = 2;
public static final int PERMISSION_WRITE_EXTERNAL_STORAGE = 3;

public boolean checkPermission(int permission) {

    if (ActivityCompat.checkSelfPermission(this, getPermission(permission)) != PackageManager.PERMISSION_GRANTED) {
        Debug.e("PERMISSION_CHECK_PERMISSION_FALSE", "-" + permission);
        return false;
    } else {
        Debug.e("PERMISSION_CHECK_PERMISSION_TRUE", "-" + permission);
        return true;
    }

}

public void requestForPermission(final int permission) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            getPermission(permission))) {

        Debug.e("PERMISSION_NEEDED", "-" + permission);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_rationale));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                ActivityCompat.requestPermissions(BaseActivity.this, new String[]{getPermission(permission)}, permission);

            }
        });

        alertDialog.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Write your code here to invoke NO event
                dialog.dismiss();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    } else {

        Debug.e("PERMISSION_ALLOW", "-" + permission);

        ActivityCompat.requestPermissions(this, new String[]{getPermission(permission)}, permission);

    }
    // END_INCLUDE(camera_permission_request)
}

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


    if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // Camera permission has been granted, preview can be displayed

        Debug.e("PERMISSION_ALLOWED", "-" + requestCode);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_granted));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();

            }
        });
        // Showing Alert Message
        alertDialog.show();

    } else {

        Debug.e("PERMISSION_DENIED", "-" + requestCode);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_not_granted));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();

            }
        });
        // Showing Alert Message
        alertDialog.show();
    }

}

public String getPermission(int permis) {

    String permission = null;

    switch (permis) {
        case PERMISSION_RECORD_AUDIO:
            permission = Manifest.permission.RECORD_AUDIO;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
        case PERMISSION_READ_EXTERNAL_STORAGE:
            permission = Manifest.permission.READ_EXTERNAL_STORAGE;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
        case PERMISSION_WRITE_EXTERNAL_STORAGE:
            permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
    }
    return permission;
}

}

0

, , android. . onRequestPermissionsResult() , , .

. : onRequestPermissionsResult . , .

- , , onRequestPermissionsResult()

0

All Articles