Где я могу получить список разрешений Android - PullRequest
25 голосов
/ 21 ноября 2010

Я пытаюсь получить список действительных разрешений Android. Я знаю «официальных» на http://developer.android.com/reference/android/Manifest.permission.html, но кажется, что есть и другие.

Например

android.permission.READ_SETTINGS
android.permission.ACCESS_LOCATION
android.permission.ACCESS_GPS

com.android.vending.CHECK_LICENSE

com.android.browser.permission.READ_HISTORY_BOOKMARKS
com.android.browser.permission.WRITE_HISTORY_BOOKMARKS

com.google.android.googleapps.permission.GOOGLE_AUTH
com.google.android.googleapps.permission.GOOGLE_AUTH.OTHER_SERVICES

com.google.android.c2dm.permission.RECEIVE

Где я могу получить такой список? Где я могу получить описание этих разрешений?

Ответы [ 8 ]

21 голосов
/ 14 апреля 2012

adb shell pm list permissions -s

Это может быть то, что вы ищете.

14 голосов
/ 21 ноября 2010

Не существует такого понятия, как исчерпывающий «список» для всех разрешений. Новые разрешения могут быть определены любым приложением, которое хочет применить свои собственные: https://developer.android.com/guide/topics/security/security.html#declaring.

Класс Manifest.permission перечисляет "системные" разрешения, и вы уже знаете о них. Другие вещи, которые вы перечислили, не относятся к системным разрешениям, а относятся только к определенным приложениям и или являются старыми именами (например, ACCESS_LOCATION и ACCESS_GPS были именами до 1.0).

grep для чего-то вроде <permission android:name= в исходном коде покажет все включенные разрешения приложений (для приложений с открытым исходным кодом), но в целом вы должны придерживаться документированных имен разрешений.

12 голосов
/ 10 января 2012

Используйте следующий фрагмент, чтобы получить все разрешения, объявленные на вашем устройстве:

Context context = this;
PackageManager pm = context.getPackageManager();
CharSequence csPermissionGroupLabel;
CharSequence csPermissionLabel;

List<PermissionGroupInfo> lstGroups = pm.getAllPermissionGroups(0);
for (PermissionGroupInfo pgi : lstGroups) {
    csPermissionGroupLabel = pgi.loadLabel(pm);
    Log.e("perm", pgi.name + ": " + csPermissionGroupLabel.toString());

    try {
        List<PermissionInfo> lstPermissions = pm.queryPermissionsByGroup(pgi.name, 0);
        for (PermissionInfo pi : lstPermissions) {
            csPermissionLabel = pi.loadLabel(pm);
            Log.e("perm", "   " + pi.name + ": " + csPermissionLabel.toString());
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
5 голосов
/ 17 мая 2013

Для просмотра всех разрешений на вашем телефоне

adb shell pm list permissions -g

Аргумент -s представляет собой краткую сводку

4 голосов
/ 30 декабря 2014

Определенно есть "больше разрешений". Ссылка , на которую вы ссылались , является просто «официальным списком» - и даже для этого она довольно неполна. Я исследовал существующие разрешения, для чего они предназначены и какое влияние они оказывают на конечного пользователя уже около года - и действительно удивляюсь, как разработчики находят то, что им нужно. Хорошее предположение, кажется, является частью этого, так как для многих разрешений поиск Google только что дал содержание файлов Manifest нескольких приложений ("использует ...").

Кроме того, рядом с «официальными разрешениями» (или, скорее, «разрешениями ядра Android») каждый разработчик может определить свое собственное приложение (например, Чарли Коллинз , уже указанный в ). его ответ ).

Во время моего исследования я составил список с моими выводами из нескольких источников (которые я перечислил вместе), добавив любые объяснения, которые я смог найти. Этот список скорее ориентирован на конечного пользователя, но все же может оказаться полезным для разработчиков. Вы можете найти его на мой сайт : Разрешения Android объяснены - двуязычный (английский и немецкий). Список включает в себя «основные разрешения», а также некоторые выбранные для конкретного приложения (в основном те, которые встречаются чаще: объявленные приложениями Google или популярные приложения, такие как Tasker и K-9 Mail ). Опять же, это, конечно, далеко не полный вопрос: «полный список» столь же вероятен, как и единорог (в день публикации он, скорее всего, уже устарел).


Изменить:

Как было запрошено в другом комментарии: если вы установили пакет с новым разрешением, который еще не включен ни в один список, и вы хотите знать «техническое имя» этого нового разрешения, вы можете получить эту информацию с вашего устройства через ADB:

adb shell dumpsys package com.foo.bar

(конечно, замените com.foo.bar на название рассматриваемого пакета). В выходных данных перейдите к строке grantedPermissions:. Ниже приведены разрешения в «полной записи», например, android.permission.INTERNET, по одному на строку. Чтобы сделать это проще:

adb shell dumpsys package com.foo.bar |egrep -A99999 "grantedPermissions:"
4 голосов
/ 21 ноября 2010

Где я могу получить такой список?

Вы не можете.

Где я могу получить описание этих разрешений?

Везде, где эти разрешения задокументированы.Во многих случаях они недокументированы и поэтому не должны использоваться.

Например, первые три были удалены из Android пару лет назад, IIRC.Последний документ описан в документации C2DM .

2 голосов
/ 03 октября 2016

Я знаю, что это поздний пост, но это скорее справка для людей в будущем, у которых тот же вопрос.

Здесь - это список всех встроенных разрешений в Android 7.0 (Nougat). Тем не менее, можно создавать собственные разрешения, так что список не содержит их всех.

Надеюсь, это поможет:)

2 голосов
/ 18 августа 2015

Вы можете получить все разрешения на устройстве, используя следующий код:

public static List<PermissionInfo> getAllPermissions(Context context) {
    PackageManager pm = context.getPackageManager();
    List<PermissionInfo> permissions = new ArrayList<>();

    List<PermissionGroupInfo> groupList = pm.getAllPermissionGroups(0);
    groupList.add(null); // ungrouped permissions

    for (PermissionGroupInfo permissionGroup : groupList) {
        String name = permissionGroup == null ? null : permissionGroup.name;
        try {
            permissions.addAll(pm.queryPermissionsByGroup(name, 0));
        } catch (PackageManager.NameNotFoundException ignored) {
        }
    }

    return permissions;
}
...