Intereting Posts
DownloadManager.Request.setNotificationVisibility не работает с jSecurityException: недопустимое значение для видимости: 2 Невозможно изменить цвет значка навигационного ящика в android Eclipse дает эту ошибку: «Не удалось создать представление: com.android.ide.eclipse.ddms.views.LogCatView» Устанавливайте фокус на счетчике, если выбрано в android Отправка данных обратно в главную активность в android Использование относительного макета в меню предпочтений PhoneGap Build Push Notification (Android) RecycleView отображает только первый элемент Android: разница между getCount () и getChildCount () в ListView Почему невозможно привязать несколько просмотров одному владельцу? Как узнать, включен ли GPS на Android с использованием Titanium Событие прокрутки в Android-браузере не срабатывает. Нужно обходное решение AutoCompleteTextView setError Эквивалент ldd для android Как взаимодействовать с BadgeProvider на телефонах Samsung, чтобы добавить счет к значку приложения?

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

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

Я написал тестовый пример (используя аналогичный метод checkCallingOrSelfPermission() где я вытащил пакет PackageInfo из системы, перечислил каждый из моих разрешений (только один, запрошенный для пакета), и отобразил результат checkCallingOrSelfPermission() . Поскольку разрешения I Проверка m в этом случае – это именно те разрешения, которые я выполняю, я бы ожидал, что 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 

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

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

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

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

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

В то время как это, кажется, работает правильно:

 PackageManager pm = getPackageManager(); boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(PERMISSION_NAME, pm.getNameForUid(getCallingUid())));