Android 有不同的权限组和权限。每个权限组代表某些权限。但是我找不到每个组拥有的权限列表。它在任何地方发布吗?
例如。android.permission.ACCOUNT_MANAGER 与权限组 ACCOUNTS 相关联。我需要一份此类关联的列表。
Android 有不同的权限组和权限。每个权限组代表某些权限。但是我找不到每个组拥有的权限列表。它在任何地方发布吗?
例如。android.permission.ACCOUNT_MANAGER 与权限组 ACCOUNTS 相关联。我需要一份此类关联的列表。
这是我在 ICS 上制作的清单。https://docs.google.com/spreadsheet/pub?key=0As7-0Nfn2fUTdEpXdHJIZVlUNWljb1RwTXVtREthSEE&single=true&gid=0&output=html
Android 权限在此处列出,权限组在此处列出。然后也可以看看PemissionInfo()。
可以使用 PackageManager getAllPermissionGroups() 和 queryPermissionsByGroup() 来枚举整个 Android 权限层次结构。下面的代码在 5.1.1 (SDK 22) 设备上生成了最后显示的输出。标记为“个人”的组具有 groupInfo.flags == 1,并且似乎对应于 Marshmallow 中称为“危险”的权限组。
由于 SDK 级别的差异以及应用程序可以定义自定义权限这一事实,您将在不同的设备上获得不同的权限层次结构。
/**
* 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 组下没有权限 * android.permission-group.ACCOUNTS(个人) 组下没有权限 * android.permission-group.AFFECTS_BATTERY android.permission.CHANGE_WIFI_MULTICAST_STATE android.permission.手电筒 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(个人) 组下没有权限 * android.permission-group.CALENDAR(个人) 组下没有权限 * android.permission-group.CAMERA(个人) 组下没有权限 * android.permission-group.COST_MONEY 组下没有权限 * 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(个人) 组下没有权限 * 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(个人) 组下没有权限 * android.permission-group.MESSAGES(个人) 组下没有权限 * android.permission-group.MICROPHONE(个人) 组下没有权限 * 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(个人) 组下没有权限 * android.permission-group.PHONE_CALLS(个人) 组下没有权限 * android.permission-group.SCREENLOCK(个人) 组下没有权限 * android.permission-group.SOCIAL_INFO(个人) 组下没有权限 * android.permission-group.STATUS_BAR android.permission.EXPAND_STATUS_BAR * android.permission-group.STORAGE(个人) 组下没有权限 * 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(个人) 组下没有权限 * android.permission-group.VOICEMAIL(个人) 组下没有权限 * 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 * 无效的 组下没有权限
Google 确实会为您提供有关权限和权限组关联的信息。 https://developer.android.com/guide/topics/permissions/overview#perm-groups
在 Android Studio 终端中,您可以使用以下命令获取信息:
adb shell pm list permissions -s
结果是这样的:
All Permissions:
Microphone: record audio
SMS: read your text messages (SMS or MMS), receive text messages (WAP), receive text messages (MMS), receive text messages (SMS), send and view SMS messages, read cell broadcast messages
This app can provide content to Bixby Home cards.: Provide Bixby Home card content, Read Bixby Home data
请注意请求您的应用所需的所有权限。工作正常并不意味着它会在未来继续工作。权限可能会从一个组移动到另一个组,因此不要依赖当前状态:
注意:Android SDK 的未来版本可能会将特定权限 > 从一个组移动到另一个组。因此,不要将应用程序的逻辑建立在这些权限组的结构之上。
例如,READ_CONTACTS 与 Android 8.1(API 级别 27)的 WRITE_CONTACTS 位于同一权限组中。如果您的应用请求READ_CONTACTS > 权限,然后请求WRITE_CONTACTS 权限,不要假设> 系统可以自动授予WRITE_CONTACTS 权限。