gpt4 book ai didi

Android checkCallingOrSelfPermission 没有正确返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:09 24 4
gpt4 key购买 nike

我正在编写一项服务,需要查看其调用者是否拥有特定的私有(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”在 条目中被 Android 重命名,但是 Android 未能在 条目中同样重命名它。它被重命名为在它前面加上我的包名称(如果我提供一个包含句点的名称,例如“test.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com