PermissionsManager is a library that enables the management of runtime permissions. This library completely replaces the standard RuntimePermissions library with the addition of modern dangerous permissions and special permissions that require approval via the settings application.
This library contains constants for:
For both types of permissions, the request principle is the same and is performed via one of the CheckAndRequestPermission methods. Example:
Of course, all permissions must be declared in the manifest, either automatically or manually.
As of version 1.2, the PermissionsManagerFileProvider class is included in the library. This FileProvider reduces the size of the final application by 0.5MB compared to the standard B4A FileProvider. This is made possible by wrapping the FileProvider class from the androidx.core:core package.
As of version 1.3, the PermissionsManagerFileProvider class is replaced with FileProvider static class module (B4X module).
To use FileProvider add the following lines to the manifest:
PermissionsManager
Author: Ivica Golubovic
Version: 1.3
If this library makes your work easier and saves time in creating your application, please make a donation.
www.paypal.com
This library contains constants for:
- Dangerous permissions,
- Special permissions.
For both types of permissions, the request principle is the same and is performed via one of the CheckAndRequestPermission methods. Example:
Dangerous:
Dim PM As PermissionsManager
PM.CheckAndRequestPermission(PermissionsManager.DANGEROUS_WRITE_EXTERNAL_STORAGE)
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
'or
'Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean)
If Result Then
'Allowed
End If
Special:
Dim PM As PermissionsManager
PM.CheckAndRequestPermission(PermissionsManager.SPECIAL_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
'or
'Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean)
If Result Then
'Allowed
End If
As of version 1.2, the PermissionsManagerFileProvider class is included in the library. This FileProvider reduces the size of the final application by 0.5MB compared to the standard B4A FileProvider. This is made possible by wrapping the FileProvider class from the androidx.core:core package.
As of version 1.3, the PermissionsManagerFileProvider class is replaced with FileProvider static class module (B4X module).
To use FileProvider add the following lines to the manifest:
Manifest::
AddApplicationText(
<provider
android:name="igolub.permissionmanager.b4a.PMFileProvider"
android:authorities="$PACKAGE$.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
)
CreateResource(xml, provider_paths,
<files-path name="name" path="shared" />
)
PermissionsManager
Author: Ivica Golubovic
Version: 1.3
- FileProvider
Copy next lines to manifest:<code>
AddApplicationText(
<provider
android:name="igolub.permissionmanager.b4a.PMFileProvider"
android:authorities="$PACKAGE$.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
)
CreateResource(xml, provider_paths,
<files-path name="name" path="shared" />
)
</code>- Functions:
- GetFileUri (FileName As String) As Object
- SetFileUriAsIntentData (mIntent As Intent, FileName As String)
- Properties:
- SharedFolder As String [read only]
- UseFileProvider As Boolean [read only]
- Functions:
- PermissionsManager
- Fields:
- DANGEROUS_ACCEPT_HANDOVER As String
Allows a calling application to continue a call which was started in another application. An example is a video calling application that wants to continue a voice call on the user's mobile network.
Constant Value: "android.permission.ACCEPT_HANDOVER".
Add line to manifest: <code>AddPermission("android.permission.ACCEPT_HANDOVER")</code>
Added in API level 28. - DANGEROUS_ACCESS_BACKGROUND_LOCATION As String
Allows an application To access location in the background. If you're requesting this permission, you must also request either ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. Requesting this permission by itself doesn't give you location access.
Constant Value: "android.permission.ACCESS_BACKGROUND_LOCATION".
Add line to manifest: <code>AddPermission("android.permission.ACCESS_BACKGROUND_LOCATION")</code>
Added in API level 29.. - DANGEROUS_ACCESS_COARSE_LOCATION As String
Allows an application To access approximate location. Alternatively, you might want ACCESS_FINE_LOCATION.
Constant Value: "android.permission.ACCESS_COARSE_LOCATION".
Add line to manifest: <code>AddPermission("android.permission.ACCESS_COARSE_LOCATION")</code>
Added in API level 1. - DANGEROUS_ACCESS_FINE_LOCATION As String
Allows an application to access precise location. Alternatively, you might want ACCESS_COARSE_LOCATION.
Constant Value: "android.permission.ACCESS_FINE_LOCATION".
Add line to manifest: <code>AddPermission("android.permission.ACCESS_FINE_LOCATION")</code>
Added in API level 1. - DANGEROUS_ACCESS_MEDIA_LOCATION As String
Allows an application to access any geographic locations persisted in the user's shared collection.
Constant Value: "android.permission.ACCESS_MEDIA_LOCATION".
Add line to manifest: <code>AddPermission("android.permission.ACCESS_MEDIA_LOCATION")</code>
Added in API level 29. - DANGEROUS_ACTIVITY_RECOGNITION As String
Allows an application to recognise physical activity.
Constant Value: "android.permission.ACTIVITY_RECOGNITION".
Add line to manifest: <code>AddPermission("android.permission.ACTIVITY_RECOGNITION")</code>
Added in API level 29. - DANGEROUS_ADD_VOICEMAIL As String
Allows an application to add voice mails into the system.
Constant Value: "com.android.voicemail.permission.ADD_VOICEMAIL".
Add line to manifest: <code>AddPermission("com.android.voicemail.permission.ADD_VOICEMAIL")</code>
Added in API level 14. - DANGEROUS_ANSWER_PHONE_CALLS As String
Allows the application to answer an incoming phone call.
Constant Value: "android.permission.ANSWER_PHONE_CALLS".
Add line to manifest: <code>AddPermission("android.permission.ANSWER_PHONE_CALLS")</code>
Added in API level 26. - DANGEROUS_BLUETOOTH_ADVERTISE As String
Required to be able to advertise to nearby Bluetooth devices.
Constant Value: "android.permission.BLUETOOTH_ADVERTISE".
Add line to manifest: <code>AddPermission("android.permission.BLUETOOTH_ADVERTISE")</code>
Added in API level 31. - DANGEROUS_BLUETOOTH_CONNECT As String
Required to be able to connect to paired Bluetooth devices.
Constant Value: "android.permission.BLUETOOTH_CONNECT".
Add line to manifest: <code>AddPermission("android.permission.BLUETOOTH_CONNECT")</code>
Added in API level 31. - DANGEROUS_BLUETOOTH_SCAN As String
Required to be able to discover and pair nearby Bluetooth devices.
Constant Value: "android.permission.BLUETOOTH_SCAN".
Add line to manifest: <code>AddPermission("android.permission.BLUETOOTH_SCAN")</code>
Added in API level 31. - DANGEROUS_BODY_SENSORS As String
Allows an application to access data from sensors that the user uses to measure what is happening inside their body, such as heart rate.
Constant Value: "android.permission.BODY_SENSORS".
Add line to manifest: <code>AddPermission("android.permission.BODY_SENSORS")</code>
Added in API level 20. - DANGEROUS_BODY_SENSORS_BACKGROUND As String
Allows an application to access data from sensors that the user uses to measure what is happening inside their body, such as heart rate. If you're requesting this permission, you must also request BODY_SENSORS. Requesting this permission by itself doesn't give you Body sensors access.
Constant Value: "android.permission.BODY_SENSORS_BACKGROUND".
Add line to manifest: <code>AddPermission("android.permission.BODY_SENSORS_BACKGROUND")</code>
Added in API level 33. - DANGEROUS_CALL_PHONE As String
Allows an application to initiate a phone call without going through the Dialler user interface for the user to confirm the call.
Constant Value: "android.permission.CALL_PHONE".
Add line to manifest: <code>AddPermission("android.permission.CALL_PHONE")</code>
Added in API level 1. - DANGEROUS_CAMERA As String
Required to be able to access the camera device. This will automatically enforce the uses-feature manifest element for all camera features. If you do not require all camera features or can properly operate if a camera is not available, then you must modify your manifest as appropriate in order to install on devices that don't support all camera features.
Constant Value: "android.permission.CAMERA".
Add line to manifest: <code>AddPermission("android.permission.CAMERA")</code>
Added in API level 1. - DANGEROUS_GET_ACCOUNTS As String
Allows access to the list of accounts in the Accounts Service.
Constant Value: "android.permission.GET_ACCOUNTS".
Add line to manifest: <code>AddPermission("android.permission.GET_ACCOUNTS")</code>
Added in API level 1. - DANGEROUS_NEARBY_WIFI_DEVICES As String
Required to be able to advertise and connect to nearby devices via Wi-Fi.
Constant Value: "android.permission.NEARBY_WIFI_DEVICES".
Add line to manifest: <code>AddPermission("android.permission.NEARBY_WIFI_DEVICES")</code>
Added in API level 33. - DANGEROUS_POST_NOTIFICATIONS As String
Allows an application to post notifications.
Constant Value: "android.permission.POST_NOTIFICATIONS".
Add line to manifest: <code>AddPermission("android.permission.POST_NOTIFICATIONS")</code>
Added in API level 33. - DANGEROUS_PROCESS_OUTGOING_CALLS As String
Allows an application to see the number being dialled during an outgoing call with the option to redirect the call to a different number or abort the call altogether.
Constant Value: "android.permission.PROCESS_OUTGOING_CALLS".
Add line to manifest: <code>AddPermission("android.permission.PROCESS_OUTGOING_CALLS")</code>
Added in API level 1.
Deprecated in API level 29. - DANGEROUS_READ_CALENDAR As String
Allows an application to read the user's calendar data.
Constant Value: "android.permission.READ_CALENDAR".
Add line to manifest: <code>AddPermission("android.permission.READ_CALENDAR")</code>
Added in API level 1. - DANGEROUS_READ_CALL_LOG As String
Allows an application to read the user's call log.
Constant Value: "android.permission.READ_CALL_LOG".
Add line to manifest: <code>AddPermission("android.permission.READ_CALL_LOG")</code>
Added in API level 16. - DANGEROUS_READ_CONTACTS As String
Allows an application to read the user's contacts data.
Constant Value: "android.permission.READ_CONTACTS".
Add line to manifest: <code>AddPermission("android.permission.READ_CONTACTS")</code>
Added in API level 1. - DANGEROUS_READ_EXTERNAL_STORAGE As String
Allows an application to read from external storage. Note: Starting in API level 33, this permission has no effect. If your app accesses other apps' media files, request one or more of these permissions instead: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO.
Starting in API level 29, applications don't need to request this permission to access files in their app-specific directory on external storage, or their own files in the MediaStore. Apps shouldn't request this permission unless they need to access other apps' files in the MediaStore.
Constant Value: "android.permission.READ_EXTERNAL_STORAGE".
Add line to manifest: <code>AddPermission("android.permission.READ_EXTERNAL_STORAGE")</code>
Added in API level 16. - DANGEROUS_READ_MEDIA_AUDIO As String
Allows an application to read audio files from external storage.
Constant Value: "android.permission.READ_MEDIA_AUDIO".
Add line to manifest: <code>AddPermission("android.permission.READ_MEDIA_AUDIO")</code>
Added in API level 33. - DANGEROUS_READ_MEDIA_IMAGES As String
Allows an application to read image files from external storage.
Constant Value: "android.permission.READ_MEDIA_IMAGES".
Add line to manifest: <code>AddPermission("android.permission.READ_MEDIA_IMAGES")</code>
Added in API level 33. - DANGEROUS_READ_MEDIA_VIDEO As String
Allows an application to read video files from external storage.
Constant Value: "android.permission.READ_MEDIA_VIDEO".
Add line to manifest: <code>AddPermission("android.permission.READ_MEDIA_VIDEO")</code>
Added in API level 33. - DANGEROUS_READ_PHONE_NUMBERS As String
Allows read access to the device's phone number(s). This is a subset of the capabilities granted by READ_PHONE_STATE but is exposed to instant applications.
Constant Value: "android.permission.READ_PHONE_NUMBERS".
Add line to manifest: <code>AddPermission("android.permission.READ_PHONE_NUMBERS")</code>
Added in API level 26. - DANGEROUS_READ_PHONE_STATE As String
Allows read only access to phone state, including the current cellular network information, the status of any ongoing calls, and a list of any PhoneAccounts registered on the device.
Constant Value: "android.permission.READ_PHONE_STATE".
Add line to manifest: <code>AddPermission("android.permission.READ_PHONE_STATE")</code>
Added in API level 1. - DANGEROUS_READ_SMS As String
Allows an application to read SMS messages.
Constant Value: "android.permission.READ_SMS".
Add line to manifest: <code>AddPermission("android.permission.READ_SMS")</code>
Added in API level 1. - DANGEROUS_RECEIVE_MMS As String
Allows an application to monitor incoming MMS messages.
Constant Value: "android.permission.RECEIVE_MMS".
Add line to manifest: <code>AddPermission("android.permission.RECEIVE_MMS")</code>
Added in API level 1. - DANGEROUS_RECEIVE_SMS As String
Allows an application to receive SMS messages.
Constant Value: "android.permission.RECEIVE_SMS".
Add line to manifest: <code>AddPermission("android.permission.RECEIVE_SMS")</code>
Added in API level 1. - DANGEROUS_RECEIVE_WAP_PUSH As String
Allows an application to receive WAP push messages.
Constant Value: "android.permission.RECEIVE_WAP_PUSH".
Add line to manifest: <code>AddPermission("android.permission.RECEIVE_WAP_PUSH")</code>
Added in API level 1. - DANGEROUS_RECORD_AUDIO As String
Allows an application to record audio.
Constant Value: "android.permission.RECORD_AUDIO".
Add line to manifest: <code>AddPermission("android.permission.RECORD_AUDIO")</code>
Added in API level 1. - DANGEROUS_SEND_SMS As String
Allows an application to send SMS messages.
Constant Value: "android.permission.SEND_SMS".
Add line to manifest: <code>AddPermission("android.permission.SEND_SMS")</code>
Added in API level 1. - DANGEROUS_USE_SIP As String
Allows an application to use SIP service.
Constant Value: "android.permission.USE_SIP".
Add line to manifest: <code>AddPermission("android.permission.USE_SIP")</code>
Added in API level 9. - DANGEROUS_UWB_RANGING As String
Required to be able to range to devices using ultra-wideband.
Constant Value: "android.permission.UWB_RANGING".
Add line to manifest: <code>AddPermission("android.permission.UWB_RANGING")</code>
Added in API level 31. - DANGEROUS_WRITE_CALENDAR As String
Allows an application to write the user's calendar data.
Constant Value: "android.permission.WRITE_CALENDAR".
Add line to manifest: <code>AddPermission("android.permission.WRITE_CALENDAR")</code>
Added in API level 1. - DANGEROUS_WRITE_CALL_LOG As String
Allows an application to write (but not read) the user's call log data.
Constant Value: "android.permission.WRITE_CALL_LOG".
Add line to manifest: <code>AddPermission("android.permission.WRITE_CALL_LOG")</code>
Added in API level 16. - DANGEROUS_WRITE_CONTACTS As String
Allows an application to write the user's contacts data.
Constant Value: "android.permission.WRITE_CONTACTS".
Add line to manifest: <code>AddPermission("android.permission.WRITE_CONTACTS")</code>
Added in API level 1. - DANGEROUS_WRITE_EXTERNAL_STORAGE As String
Allows an application to write to external storage. Note: If your application targets API level 29 or higher, this permission has no effect.
Constant Value: "android.permission.WRITE_EXTERNAL_STORAGE".
Add line to manifest: <code>AddPermission("android.permission.WRITE_EXTERNAL_STORAGE")</code>
Added in API level 4. - SPECIAL_APP_NOTIFICATION As String
Show notification settings for a single application (in most case's it's unrestricted by default).
Constant Value: "android.settings.APP_NOTIFICATION_SETTINGS"
Added in API level 26. - SPECIAL_APP_NOTIFICATION_BUBBLE As String
Show notification bubble settings for a single application.
Constant Value: "android.settings.APP_NOTIFICATION_BUBBLE_SETTINGS"
Added in API level 29. - SPECIAL_IGNORE_BACKGROUND_DATA_RESTRICTIONS As String
Show screen for controlling background data restrictions for a particular application (in most case's it's unrestricted by default).
Constant Value: "android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS"
Add line to manifest: <code>AddPermission("android.permission.ACCESS_NETWORK_STATE")</code>
Added in API level 24. - SPECIAL_INSTALL_FROM_UNKNOWN_SOURCES As String
Allows to install applications from unknown sources.
Added in API level 1.
Deprecated in API level 26. Use SPECIAL_REQUEST_INSTALL_PACKAGES instead.
Use this permission only for devices up to SDK25. In higher SDK versions, this setting does not exist and during the check, the return result will always be False. - SPECIAL_MANAGE_EXTERNAL_STORAGE As String
Allows an application a broad access to external storage in scoped storage. Intended to be used by few applications that need to manage files on behalf of the users.
Constant Value: "android.permission.MANAGE_EXTERNAL_STORAGE".
Add line to manifest: <code>AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")</code>
Added in API level 30. - SPECIAL_MANAGE_MEDIA As String
Allows an application to modify and delete media files on this device or any connected storage device without user confirmation.
IMPORTANT: Applications must already be granted the READ_EXTERNAL_STORAGE or MANAGE_EXTERNAL_STORAGE permissions for this permission to take effect.
Constant Value: "android.permission.MANAGE_MEDIA".
Add line to manifest: <code>AddPermission("android.permission.MANAGE_MEDIA")</code>
Added in API level 31. - SPECIAL_PACKAGE_USAGE_STATS As String
Allows an application to collect component usage statistics.
Constant Value: "android.permission.PACKAGE_USAGE_STATS".
Add line to manifest: <code>AddPermission("android.permission.PACKAGE_USAGE_STATS")</code>
Added in API level 23. - SPECIAL_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS As String
Constant Value: "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS".
Add line to manifest: <code>AddPermission("android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS")</code>
Added in API level 23. - SPECIAL_REQUEST_INSTALL_PACKAGES As String
Allows an application to request installing packages. Applications targeting APIs greater than 25 must hold this permission in order to use Intent.ACTION_INSTALL_PACKAGE.
Constant Value: "android.permission.REQUEST_INSTALL_PACKAGES".
Add line to manifest: <code>AddPermission("android.permission.REQUEST_INSTALL_PACKAGES")</code>
Added in API level 26.
For lower SDK devices use SPECIAL_INSTALL_FROM_UNKNOWN_SOURCES. - SPECIAL_SCHEDULE_EXACT_ALARM As String
Allows applications to use exact alarm APIs.
This is a special access permission that can be revoked by the system or the user. It should only be used to enable user-facing features that require exact alarms.
Constant Value: "android.permission.SCHEDULE_EXACT_ALARM".
Add line to manifest: <code>AddPermission("android.permission.SCHEDULE_EXACT_ALARM")</code>
Added in API level 31. - SPECIAL_SYSTEM_ALERT_WINDOW As String
Allows an application to be shown on top of all other applications. Very few applications should use this permission; these windows are intended for system-level interaction with the user.
Constant Value: "android.permission.SYSTEM_ALERT_WINDOW".
Add line to manifest: <code>AddPermission("android.permission.SYSTEM_ALERT_WINDOW")</code>
Added in API level 1. - SPECIAL_WRITE_SETTINGS As String
Allows an application to read or write the system settings.
Constant Value: "android.permission.WRITE_SETTINGS".
Add line to manifest: <code>AddPermission("android.permission.WRITE_SETTINGS")</code>
Added in API level 1
- DANGEROUS_ACCEPT_HANDOVER As String
- Fields:
- PermissionsManager
- Events:
- ApplicationResumeAllowed
- Functions:
- CheckAndRequestPermission (Permission As String)
Checks whether the application has been granted the specified permission. If not then the user will be shown a dialog asking for permission.
The Activity_PermissionResult or B4XPage_PermissionResult will be raised with the result (in all cases).
This method can only be called from an Activity. - CheckAndRequestPermission2 (Permission As String, DescriptionDialogText As String, DescriptionDialogTitle As String, DialogCloseButtonText As String)
Checks whether the application has been granted the specified permission. If not, dialog with specified DescriptionText and Title will be shown in which you can explain to user for what the application requires this permission. After user closes dialog, a default dialog with asking for permission will be shown.
The Activity_PermissionResult or B4XPage_PermissionResult will be raised with the result (in all cases).
This method can only be called from an Activity. - CheckPermission (Permission As String) As Boolean
Checks whether the application has been granted the specified permission.
This method can be called from a Service. - GetAllSafeDirsExternal (subFolder As String) As List
Returns an List with all the external folders available to your application.
The first element will be the same as the value returned from GetSafeDirDefaultExternal.
On Android 4.4+ no permission is required to access these folders.
On older versions only one folder will be returned. You should add the permission as explained in GetSafeDirDefaultExternal documentation.
SubFolder - A sub folder that will be created for your application. Pass an empty string if not needed. - GetSafeDirDefaultExternal (subFolder As String) As String
Returns the path to the app's default folder on the secondary storage device.
The path to File.DirInternal will be returned if there is no secondary storage available.
It is a better alternative to File.DirDefaultExternal. On Android 4.4+ no permission is required to access this folder.
SubFolder - A sub folder that will be created for your application. Pass an empty string if not needed. - IsDangerous (Permission As String) As Boolean
Check if the permission is Dangerous permission. - IsDangerousOrSpecial (Permission As String) As Boolean
Check if the permission is Special or Dangerous permission. - IsSpecial (Permission As String) As Boolean
Check if the permission is Special permission.
- CheckAndRequestPermission (Permission As String)
- Properties:
- AllPermissionsInManifestFile As List [read only]
Returns the List of all permissions specified in manifest file. You can use this list to ask for all permissions in manifest at the same time.
Example: <code>
For Each permission As String In PermissionManager1.AllPermissionsInManifestFile
PermissionManager1.CheckAndRequestPermission(permission)
Wait For Activity_PermissionResult (permission As String, Result As Boolean)
Next</code> - ApplicationResumeAllowed As Boolean
You can use this property to prevent the application to resume until the permissions requesting process will finish. Before start of permissions requesting process you need to set this value to False. When permissions process is finished, you must set this value to True. PermissionsManager_ApplicationResumeAllowed event will be triggered when you set value to True. Default value is True.
Example: <code>
PermissionManager1.ApplicationResumeAllowed=False 'Start preventing Application to resume.
For Each permission As String In PermissionManager1.AllPermissionsInManifestFile
PermissionManager1.CheckAndRequestPermission(permission)
Wait For Activity_PermissionResult (permission As String, Result As Boolean)
Next
PermissionManager1.ApplicationResumeAllowed=True 'Stop preventing Application to resume.</code>
On Activity_Resume or other part of code for which you want to prevent to resume until permissions requesting process is ended:
Example:<code>
If PermissionsManager1.ApplicationResumeAllowed=False Then
Wait For PermissionsManager_ApplicationResumeAllowed
End If
'Rest of the code...</code> - DeviceSDK As Int [read only]
Returns the integer value of device's SDK version.
You don't need Phone library.
- AllPermissionsInManifestFile As List [read only]
- Events:
If this library makes your work easier and saves time in creating your application, please make a donation.
Donate to Ivica Golubovic
Help support Ivica Golubovic by donating or sharing with your friends.
Attachments
Last edited: