Skip to main content

Overview

The PermissionManagementUtil class provides utilities for checking and requesting runtime permissions in Android applications. It simplifies permission management using AndroidX compatibility APIs.

Methods

isAllPermissionGranted

Checks if all specified permissions are granted.
boolean granted = PermissionManagementUtil.isAllPermissionGranted(
    context, 
    new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}
);
context
Context
required
The Android application context
permission
String[]
required
Array of permission names to check
Returns: boolean - true if all permissions are granted, false if any permission is denied or if context/permissions are invalid

requestPermission

Requests the specified permissions from the user.
PermissionManagementUtil.requestPermission(
    activity,
    new String[]{Manifest.permission.CAMERA},
    CAMERA_PERMISSION_CODE
);
activity
Activity
required
The activity requesting the permissions
permission
String[]
required
Array of permission names to request
permissionCode
int
required
Request code to identify this permission request in the callback

Usage Examples

Camera Permission

public class CameraActivity extends AppCompatActivity {
    private static final int CAMERA_PERMISSION_CODE = 100;

    private void openCamera() {
        String[] permissions = {Manifest.permission.CAMERA};
        
        if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
            // Permission already granted, open camera
            launchCamera();
        } else {
            // Request permission
            PermissionManagementUtil.requestPermission(
                this, 
                permissions, 
                CAMERA_PERMISSION_CODE
            );
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                         @NonNull String[] permissions, 
                                         @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == CAMERA_PERMISSION_CODE) {
            if (grantResults.length > 0 && 
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                launchCamera();
            } else {
                Toast.makeText(this, "Camera permission denied", 
                    Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void launchCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA_REQUEST_CODE);
    }
}

Multiple Permissions

public class RecordVideoActivity extends AppCompatActivity {
    private static final int VIDEO_PERMISSIONS_CODE = 101;

    private void startRecording() {
        String[] permissions = {
            Manifest.permission.CAMERA,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        
        if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
            // All permissions granted
            initializeRecorder();
        } else {
            // Request all permissions at once
            PermissionManagementUtil.requestPermission(
                this, 
                permissions, 
                VIDEO_PERMISSIONS_CODE
            );
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                         @NonNull String[] permissions, 
                                         @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == VIDEO_PERMISSIONS_CODE) {
            // Check if all permissions were granted
            if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
                initializeRecorder();
            } else {
                showPermissionDeniedDialog();
            }
        }
    }
}

Storage Permissions

public class FilePickerActivity extends AppCompatActivity {
    private static final int STORAGE_PERMISSION_CODE = 102;

    private void selectFile() {
        String[] permissions;
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            permissions = new String[]{
                Manifest.permission.READ_MEDIA_IMAGES,
                Manifest.permission.READ_MEDIA_VIDEO
            };
        } else {
            permissions = new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE
            };
        }
        
        if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
            openFilePicker();
        } else {
            PermissionManagementUtil.requestPermission(
                this, 
                permissions, 
                STORAGE_PERMISSION_CODE
            );
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                         @NonNull String[] permissions, 
                                         @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == STORAGE_PERMISSION_CODE) {
            if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
                openFilePicker();
            } else {
                Toast.makeText(this, 
                    "Storage permission is required to select files", 
                    Toast.LENGTH_LONG).show();
            }
        }
    }
}

Location Permissions

public class MapActivity extends AppCompatActivity {
    private static final int LOCATION_PERMISSION_CODE = 103;

    private void enableLocation() {
        String[] permissions = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        };
        
        if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
            // Start location updates
            requestLocationUpdates();
        } else {
            // Show rationale if needed
            if (shouldShowRequestPermissionRationale(
                    Manifest.permission.ACCESS_FINE_LOCATION)) {
                showLocationRationale();
            } else {
                PermissionManagementUtil.requestPermission(
                    this, 
                    permissions, 
                    LOCATION_PERMISSION_CODE
                );
            }
        }
    }

    private void showLocationRationale() {
        new AlertDialog.Builder(this)
            .setTitle("Location Permission")
            .setMessage("This app needs location access to show nearby places.")
            .setPositiveButton("OK", (dialog, which) -> {
                String[] permissions = {
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
                };
                PermissionManagementUtil.requestPermission(
                    this, 
                    permissions, 
                    LOCATION_PERMISSION_CODE
                );
            })
            .setNegativeButton("Cancel", null)
            .show();
    }
}

With Fragment

public class ProfileFragment extends Fragment {
    private static final int CAMERA_PERMISSION_CODE = 104;

    private void updateProfilePicture() {
        String[] permissions = {Manifest.permission.CAMERA};
        
        if (PermissionManagementUtil.isAllPermissionGranted(
                requireContext(), permissions)) {
            openCamera();
        } else {
            // Request permission from fragment
            requestPermissions(permissions, CAMERA_PERMISSION_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                         @NonNull String[] permissions, 
                                         @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == CAMERA_PERMISSION_CODE) {
            if (PermissionManagementUtil.isAllPermissionGranted(
                    requireContext(), permissions)) {
                openCamera();
            } else {
                Snackbar.make(requireView(), 
                    "Camera permission denied", 
                    Snackbar.LENGTH_LONG).show();
            }
        }
    }
}

Notification Permission (Android 13+)

public class NotificationActivity extends AppCompatActivity {
    private static final int NOTIFICATION_PERMISSION_CODE = 105;

    private void enableNotifications() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            String[] permissions = {Manifest.permission.POST_NOTIFICATIONS};
            
            if (PermissionManagementUtil.isAllPermissionGranted(this, permissions)) {
                // Notifications enabled
                scheduleNotification();
            } else {
                PermissionManagementUtil.requestPermission(
                    this, 
                    permissions, 
                    NOTIFICATION_PERMISSION_CODE
                );
            }
        } else {
            // No permission needed for older versions
            scheduleNotification();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
                                         @NonNull String[] permissions, 
                                         @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == NOTIFICATION_PERMISSION_CODE) {
            if (grantResults.length > 0 && 
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                scheduleNotification();
            } else {
                Toast.makeText(this, 
                    "Notification permission denied", 
                    Toast.LENGTH_SHORT).show();
            }
        }
    }
}

Best Practices

Use isAllPermissionGranted() before calling requestPermission() to avoid unnecessary permission dialogs.
if (!PermissionManagementUtil.isAllPermissionGranted(context, permissions)) {
    PermissionManagementUtil.requestPermission(activity, permissions, code);
}
Define unique request codes as constants to identify different permission requests:
private static final int CAMERA_PERMISSION_CODE = 100;
private static final int LOCATION_PERMISSION_CODE = 101;
private static final int STORAGE_PERMISSION_CODE = 102;
Explain why your app needs permissions before requesting them, especially if the user has denied them before:
if (shouldShowRequestPermissionRationale(permission)) {
    // Show explanation dialog
    showRationaleDialog();
} else {
    // Request permission
    PermissionManagementUtil.requestPermission(...);
}
Provide alternative functionality or clear guidance when permissions are denied:
if (!granted) {
    new AlertDialog.Builder(this)
        .setMessage("This feature requires camera permission")
        .setPositiveButton("Settings", (d, w) -> openAppSettings())
        .show();
}

Required Manifest Declarations

Declare all permissions in your AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Camera -->
    <uses-permission android:name="android.permission.CAMERA" />
    
    <!-- Audio -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
    <!-- Location -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    <!-- Storage (Android 12 and below) -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" 
                     android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32" />
    
    <!-- Media (Android 13+) -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    
    <!-- Notifications (Android 13+) -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest>

Common Permission Groups

// Camera and Audio
String[] mediaPermissions = {
    Manifest.permission.CAMERA,
    Manifest.permission.RECORD_AUDIO
};

// Location
String[] locationPermissions = {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
};

// Storage (Android 12 and below)
String[] storagePermissions = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE
};

// Media (Android 13+)
String[] mediaPermissions13 = {
    Manifest.permission.READ_MEDIA_IMAGES,
    Manifest.permission.READ_MEDIA_VIDEO,
    Manifest.permission.READ_MEDIA_AUDIO
};

Notes

  • The isAllPermissionGranted() method returns false if the context is null or the permissions array is empty
  • All permissions in the array must be granted for the method to return true
  • Uses AndroidX compatibility APIs (ContextCompat, ActivityCompat) for backward compatibility
  • Permission requests must be made from an Activity, not from a Context alone

Build docs developers (and LLMs) love