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 }
);
The Android application context
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
);
The activity requesting the permissions
Array of permission names to request
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
Always Check Before Requesting
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 ;
Show Permission Rationale
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 (...);
}
Handle Denied Permissions Gracefully
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