我正在编写一项服务,该服务需要查看其调用者是否拥有特定的私人权限。我不想阻止没有此权限的呼叫者,我只想知道状态以便我做出相应的反应。看起来 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