【问题标题】:Android checkCallingOrSelfPermission not returning properlyAndroid checkCallingOrSelfPermission 未正确返回
【发布时间】:2012-07-10 19:51:15
【问题描述】:

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

【问题讨论】:

    标签: android permissions


    【解决方案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())));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多