Squeak.ru - шаблоны программирования

Android checkCallingOrSelfPermission не возвращается должным образом

Я пишу службу, которая должна видеть, имеет ли вызывающая сторона определенное частное разрешение. Я не хочу препятствовать вызывающим абонентам, у которых нет этого разрешения, я только хочу знать статус, чтобы я мог реагировать соответствующим образом. Казалось бы, метод Context checkCallingPermission() идеально подходит для того, что мне нужно, возвращая 0, если вызывающая сторона имеет указанное разрешение, и -1 в противном случае. Я обнаружил, что -1 возвращается во всех случаях.

Я написал тестовый пример (используя аналогичный метод checkCallingOrSelfPermission(), где я вытащил PackageInfo моего пакета из системы, перечислил каждое из моих разрешений (только одно запрошенное для пакета) и отобразил результат checkCallingOrSelfPermission(). Поскольку разрешения, которые я проверяю, в этом случае это именно те разрешения, которые у меня есть, я ожидаю, что checkCallingOrSelfPermission() вернет только 0 (PackageManager.PERMISSION_GRANTED)... купите, он возвращает только -1 (PackageManager.PERMISSION_DENIED).

Я проверил это и получил одинаковые результаты как на эмуляторе 4.0, так и на устройстве 2.3.

Любая идея, что я делаю неправильно, чтобы вызвать сбой этих вызовов?

Мой тестовый манифест включает:

<permission
    android:protectionLevel="signatureOrSystem"
    android:name="abcd" />
<uses-permission android:name="abcd" />

Код моей тестовой активности:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    PackageManager pm = getPackageManager();
    try {
        PackageInfo pi = pm.getPackageInfo("com.test.check", PackageManager.GET_PERMISSIONS);
        if ((null == pi.requestedPermissions) ||
            (pi.requestedPermissions.length == 0)) {
            Log.d("CHECK", "Package has NO permissions!");
            finish();
            return;
        }

        for (int i = 0; i < pi.requestedPermissions.length; ++i) {
            Log.d("CHECK", pi.requestedPermissions[i] + " " + checkCallingOrSelfPermission(pi.requestedPermissions[i]));
        }
    } catch (NameNotFoundException e) {
        Log.d("CHECK", "Package name is wrong!");
    }

    finish();
}

и мои результаты теста:

D/CHECK   ( 3600): abcd -1
10.07.2012

Ответы:


1

Мне не удалось решить эту проблему в рамках моей службы, требующей проверки разрешений, но я нашел обходной путь для службы (и проблему в моем тестовом примере).

Мой тестовый пример не удался, потому что разрешение, которое я создал и проверил с помощью «abcd», было переименовано Android в записи «permission», однако Android не смог переименовать его в записи «uses-permission». Он был переименован, чтобы к нему было добавлено имя моего пакета (и это переименование не происходит, если я указываю имя, включающее в себя точку, например «test.abcd»).

Хотя изменение имени разрешения исправило мой тестовый пример, в моем реальном случае в службе уже использовалось полное имя разрешения, и checkCallingPermission() продолжает давать сбой. Однако я обнаружил, что метод PackageManager checkPermission() работает так, как ожидалось (за счет необходимости получения имени пакета вызывающего объекта).

Итак, подведем итог: следующее работает неправильно (хотя я не знаю, почему):

boolean permission = (PackageManager.PERMISSION_GRANTED == checkCallingPermission(PERMISSION_NAME));

пока это работает правильно:

PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(PERMISSION_NAME, pm.getNameForUid(getCallingUid())));
11.07.2012
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...