- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一项服务,需要查看其调用者是否拥有特定的私有(private)权限。我不想阻止缺乏此权限的调用者,我只想知道状态以便我可以做出相应的 react 。上下文方法 checkCallingPermission()
似乎非常适合我的需要,如果调用者具有指定权限则返回 0,否则返回 -1。不过,我发现在所有情况下都会返回 -1。
我写了一个测试用例(使用类似的方法checkCallingOrSelfPermission()
,我从系统中提取了我的包的PackageInfo
,枚举了我的每个权限(只请求了一个包),并显示 checkCallingOrSelfPermission()
的结果。由于我在这种情况下检查的权限正是我持有的权限,所以我希望 checkCallingOrSelfPermission()
仅返回 0 (PackageManager.PERMISSION_GRANTED)...购买它仅返回 -1 (PackageManager.PERMISSION_DENIED)。
我已经检查过了,在 4.0 模拟器和 2.3 设备上都收到了相同的结果。
知道我做错了什么导致这些调用失败吗?
我的测试 list 包括:
<permission
android:protectionLevel="signatureOrSystem"
android:name="abcd" />
<uses-permission android:name="abcd" />
我的测试 Activity 代码是:
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”在
虽然更改权限名称修复了我的测试用例,但我在服务中的实际案例已经使用了完全限定的权限名称,并且 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())));
关于Android checkCallingOrSelfPermission 没有正确返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420845/
我正在编写一项服务,需要查看其调用者是否拥有特定的私有(private)权限。我不想阻止缺乏此权限的调用者,我只想知道状态以便我可以做出相应的 react 。上下文方法 checkCallingPer
我正在检查 Context 类中的 checkCallingOrSelfPermission() 并想知道如何利用它;即,如果某些应用程序触发了被调用方/您的应用程序的方法,该方法又调用 checkC
我是一名优秀的程序员,十分优秀!