Androidにはさまざまな権限グループと権限があります。各権限グループは、特定の権限を表します。しかし、各グループが保持している権限のリストが見つかりませんでした。どこかに掲載されていますか?
たとえば。android.permission.ACCOUNT_MANAGERは、権限グループACCOUNTSに関連付けられています。そのような関連のリストが必要です。
Androidにはさまざまな権限グループと権限があります。各権限グループは、特定の権限を表します。しかし、各グループが保持している権限のリストが見つかりませんでした。どこかに掲載されていますか?
たとえば。android.permission.ACCOUNT_MANAGERは、権限グループACCOUNTSに関連付けられています。そのような関連のリストが必要です。
Androidの権限はここにリストされ、権限グループはここにリストされています。そして、PemissionInfo()も見ることができます。
これは私がICSで作成したリストです。https://docs.google.com/spreadsheet/pub?key=0As7-0Nfn2fUTdEpXdHJIZVlUNWljb1RwTXVtREthSEE&single=true&gid=0&output=html
PackageManager getAllPermissionGroups()およびqueryPermissionsByGroup()を使用して、Androidのアクセス許可階層全体を列挙することができます。以下のコードは、5.1.1(SDK 22)デバイスで最後に示す出力を生成しました。「個人」とマークされたグループはgroupInfo.flags==1であり、マシュマロで「危険」と呼ばれる許可グループに対応しているように見えます。
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.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(個人) グループの下に権限がありません * 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権限を自動的に付与できると想定しないでください。