I an new to Android Development. I was looking at the android manifest permissions. There are two things. Permissions and Permission Groups. I know that the list at
http://developer.android.com/reference/android/Manifest.permission.html
is not comprehensive and you can add your own permission as well.But, I want to ask that is this possible to map each permission into the permission groups mentioned at
http://developer.android.com/reference/android/Manifest.permission_group.html.
The Android source contains the actual mappings between the default permission groups and permissions.
https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml
If you wanted a mapping from permission group to permission you could take AndroidMainifest.xml file for the version of Android you are working with and parse the XML to create the mapping. So to answer your question yes it is possible, but it sounds like this may be overkill for your task.
UPDATE: Because I actually needed this mapping myself for another project I decided to share my code to create this mapping. You can view the results in the github repository.
Link: https://github.com/benjholla/AndroidPermissionAttributeMapper
UPDATE 2:
My group open sourced our solution that generates this mapping and some other object wrappers around Android documentation for permissions. There are some tutorials on the project page and the github repo.
Project Page: https://ensoftcorp.github.io/android-essentials-toolbox/
Source: https://github.com/EnSoftCorp/android-essentials-toolbox
It's possible to use PackageManager getAllPermissionGroups() and queryPermissionsByGroup()
to enumerate the entire Android permission hierarchy. The code below produced the output shown at the end on a 5.1.1 (SDK 22) device. The groups marked "personal" have groupInfo.flags == 1, and appear to correspond to the permission groups that are called "dangerous" in Marshmallow.
You will get different permission hierarchies on different devices due to differences in SDK levels and the fact that apps can define custom permissions.
/**
* Uses PackageManager getAllPermissionGroups() and queryPermissionsByGroup()
* to enumerate the Android permission hierarchy.
*/
private void showPermissionTree()
{
final PackageManager pm = m_context.getPackageManager();
if (pm == null)
return;
/*
* Get a list of all permission groups and sort them alphabetically.
* Then add to the end of the list the special case of a null group name. There can be
* numerous permissions that are not listed under a group name.
*/
List<PermissionGroupInfo> groupInfoList = pm.getAllPermissionGroups(0);
if (groupInfoList == null)
return;
ArrayList<String> groupNameList = new ArrayList<>();
for (PermissionGroupInfo groupInfo : groupInfoList) {
String groupName = groupInfo.name;
if (groupName != null) {
if (Build.VERSION.SDK_INT >= 17) {
/*
* SDK 17 added the flags field. If non-zero, the permission group contains
* permissions that control access to user personal data.
* N.B. These are the permissions groups that are called "dangerous" in
* Marshmallow.
*/
if (groupInfo.flags != 0) {
groupName += " (personal)";
}
}
groupNameList.add(groupName);
}
}
Collections.sort(groupNameList);
groupNameList.add(null);
/*
* Loop though each permission group, adding to the StringBuilder the group name and
* the list of all permissions under that group.
*/
StringBuilder sb = new StringBuilder(10000);
final String INDENT = " ";
for (String groupName : groupNameList) {
if (groupName == null)
groupName = "null";
sb.append("* ").append(groupName).append("\n");
ArrayList<String> permissionNameList = getPermissionsForGroup(groupName);
if (permissionNameList.size() > 0) {
for (String permission : permissionNameList) {
sb.append(INDENT).append(permission).append("\n");
}
} else {
sb.append(INDENT).append("no permissions under group\n");
}
sb.append("\n");
}
m_textView.setText(sb.toString());
}
/*
* Gets and returns a list of all permission under the specified group, sorted alphabetically.
*
* N.B. groupName can be null. The docs for PackageManager.queryPermissionsByGroup() say
* "Use null to find all of the permissions not associated with a group."
*/
private ArrayList<String> getPermissionsForGroup(String groupName)
{
final PackageManager pm = m_context.getPackageManager();
final ArrayList<String> permissionNameList = new ArrayList<>();
try {
List<PermissionInfo> permissionInfoList =
pm.queryPermissionsByGroup(groupName, PackageManager.GET_META_DATA);
if (permissionInfoList != null) {
for (PermissionInfo permInfo : permissionInfoList) {
String permName = permInfo.name;
if (permName == null) {
permName = "null";
} else if (permName.isEmpty()) {
permName = "empty";
}
permissionNameList.add(permName);
}
}
}
catch (PackageManager.NameNotFoundException e) {
// e.printStackTrace();
Log.d(TAG, "permissions not found for group = " + groupName);
}
Collections.sort(permissionNameList);
return permissionNameList;
}
* android.permission-group.ACCESSIBILITY_FEATURES
no permissions under group
* android.permission-group.ACCOUNTS (personal)
no permissions under group
* android.permission-group.AFFECTS_BATTERY
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.FLASHLIGHT
android.permission.TRANSMIT_IR
android.permission.VIBRATE
android.permission.WAKE_LOCK
* android.permission-group.APP_INFO
android.permission.GET_TASKS
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MANAGE_ACTIVITY_STACKS
android.permission.PERSISTENT_ACTIVITY
android.permission.REAL_GET_TASKS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REMOVE_TASKS
android.permission.REORDER_TASKS
android.permission.RESTART_PACKAGES
* android.permission-group.AUDIO_SETTINGS
android.permission.MODIFY_AUDIO_SETTINGS
* android.permission-group.BLUETOOTH_NETWORK
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BLUETOOTH_MAP
android.permission.BLUETOOTH_PRIVILEGED
* android.permission-group.BOOKMARKS (personal)
no permissions under group
* android.permission-group.CALENDAR (personal)
no permissions under group
* android.permission-group.CAMERA (personal)
no permissions under group
* android.permission-group.COST_MONEY
no permissions under group
* android.permission-group.DEVELOPMENT_TOOLS
android.permission.ACCESS_ALL_EXTERNAL_STORAGE
android.permission.CHANGE_CONFIGURATION
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_ALWAYS_FINISH
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SIGNAL_PERSISTENT_PROCESSES
android.permission.WRITE_SECURE_SETTINGS
com.android.chrome.permission.DEBUG
* android.permission-group.DEVICE_ALARMS (personal)
no permissions under group
* android.permission-group.DISPLAY
android.permission.SYSTEM_ALERT_WINDOW
* android.permission-group.HARDWARE_CONTROLS
android.permission.ACCESS_FM_RADIO
android.permission.ACCESS_MTP
android.permission.HARDWARE_TEST
android.permission.MANAGE_USB
* android.permission-group.LOCATION (personal)
no permissions under group
* android.permission-group.MESSAGES (personal)
no permissions under group
* android.permission-group.MICROPHONE (personal)
no permissions under group
* android.permission-group.NETWORK
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BROADCAST_NETWORK_PRIVILEGED
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.CONNECTIVITY_INTERNAL
android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
android.permission.INTERNET
android.permission.LOOP_RADIO
android.permission.NFC
android.permission.READ_WIFI_CREDENTIAL
android.permission.RECEIVE_DATA_ACTIVITY_CHANGE
android.permission.SCORE_NETWORKS
com.android.vending.BILLING
com.android.vending.CHECK_LICENSE
com.google.android.c2dm.permission.RECEIVE
com.google.android.c2dm.permission.SEND
com.google.android.gtalkservice.permission.SEND_HEARTBEAT
com.google.android.permission.BROADCAST_DATA_MESSAGE
com.google.android.xmpp.permission.BROADCAST
com.google.android.xmpp.permission.SEND_RECEIVE
com.google.android.xmpp.permission.USE_XMPP_ENDPOINT
com.google.android.xmpp.permission.XMPP_ENDPOINT_BROADCAST
com.gsma.services.nfc.permission.TRANSACTION_EVENT
* android.permission-group.PERSONAL_INFO (personal)
no permissions under group
* android.permission-group.PHONE_CALLS (personal)
no permissions under group
* android.permission-group.SCREENLOCK (personal)
no permissions under group
* android.permission-group.SOCIAL_INFO (personal)
no permissions under group
* android.permission-group.STATUS_BAR
android.permission.EXPAND_STATUS_BAR
* android.permission-group.STORAGE (personal)
no permissions under group
* android.permission-group.SYNC_SETTINGS
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.WRITE_SYNC_SETTINGS
* android.permission-group.SYSTEM_CLOCK
android.permission.SET_TIME_ZONE
* android.permission-group.SYSTEM_TOOLS
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_MOCK_LOCATION
android.permission.ACCESS_PDB_STATE
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.BATTERY_STATS
android.permission.BLUETOOTH_STACK
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_STICKY
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.CLEAR_APP_CACHE
android.permission.DIAGNOSTIC
android.permission.FORCE_STOP_PACKAGES
android.permission.GET_APP_OPS_STATS
android.permission.GET_DETAILED_TASKS
android.permission.GET_PACKAGE_SIZE
android.permission.GLOBAL_SEARCH
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.INTERACT_ACROSS_USERS
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.MANAGE_USERS
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.MOUNT_FORMAT_FILESYSTEMS
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.NET_ADMIN
android.permission.NET_TUNNELING
android.permission.OEM_UNLOCK_STATE
android.permission.READ_DREAM_STATE
android.permission.READ_SEARCH_INDEXABLES
android.permission.RECOVERY
android.permission.REMOTE_AUDIO_PLAYBACK
android.permission.SET_ANIMATION_SCALE
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.SET_SCREEN_COMPATIBILITY
android.permission.SET_WALLPAPER_COMPONENT
android.permission.START_ANY_ACTIVITY
android.permission.START_TASKS_FROM_RECENTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.SUBSCRIBED_FEEDS_WRITE
android.permission.WRITE_APN_SETTINGS
android.permission.WRITE_DREAM_STATE
android.permission.WRITE_SETTINGS
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
com.android.launcher3.permission.READ_SETTINGS
com.android.launcher3.permission.WRITE_SETTINGS
com.google.android.launcher.permission.READ_SETTINGS
com.google.android.launcher.permission.WRITE_SETTINGS
com.motorola.permission.ACCESS_COGRADIO
* android.permission-group.USER_DICTIONARY (personal)
no permissions under group
* android.permission-group.VOICEMAIL (personal)
no permissions under group
* android.permission-group.WALLPAPER
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
* android.permission-group.WRITE_USER_DICTIONARY
android.permission.WRITE_USER_DICTIONARY
* com.google.android.gms.permission.CAR_INFORMATION
com.google.android.gms.permission.CAR_FUEL
com.google.android.gms.permission.CAR_MILEAGE
com.google.android.gms.permission.CAR_VENDOR_EXTENSION
* null
no permissions under group
There is a table in the API Guides, but only for dangerous permissions:
https://developer.android.com/guide/topics/security/permissions.html#perm-groups
As far as I Know: Manifest.permission_group*AB* = Manifest.permission*A* + Manifest.permission*B*
take a look at this instance:
android.permission-group.MESSAGES
= SEND_SMS + WRITE_SMS + RECEIVE_SMS + READ_SMS + BROADCAST_SMS
I hope you get the idea.