Я пишу службу, которая должна видеть, имеет ли вызывающая сторона определенное частное разрешение. Я не хочу препятствовать вызывающим абонентам, у которых нет этого разрешения, я только хочу знать статус, чтобы я мог реагировать соответствующим образом. Казалось бы, метод 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