mah*_*mah 4 permissions android
我正在编写一个服务,需要查看其调用者是否拥有特定的私有权限.我不想阻止缺少此权限的呼叫者,我只想知道状态,以便我可以做出相应的反应.看起来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" />
Run Code Online (Sandbox Code Playgroud)
我的测试活动代码是:
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();
}
Run Code Online (Sandbox Code Playgroud)
我的测试结果如下:
D/CHECK ( 3600): abcd -1
Run Code Online (Sandbox Code Playgroud)
我无法在需要检查权限的服务范围内解决此问题,但我找到了解决该服务的问题(以及我的测试用例中的问题).
我的测试用例失败,因为我创建并检查的权限"abcd"是由Android在<permission>条目中重命名的,但Android无法在<uses-permission>条目中同等地重命名它.它被重命名为我的包名前缀(如果我提供一个包含句点的名称,例如"test.abcd"),则不会重命名.
虽然更改权限名称修复了我的测试用例,但我在服务中的实际情况已经使用了完全限定的权限名称并checkCallingPermission()继续失败.然而,我发现PackageManager的checkPermission()方法确实按预期工作(代价是我需要检索调用者包的名称).
总而言之,以下不能正常工作(虽然我不知道为什么):
boolean permission = (PackageManager.PERMISSION_GRANTED == checkCallingPermission(PERMISSION_NAME));
Run Code Online (Sandbox Code Playgroud)
虽然这似乎正常工作:
PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(PERMISSION_NAME, pm.getNameForUid(getCallingUid())));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5434 次 |
| 最近记录: |