5

発信者が特定の個人的な許可を持っているかどうかを確認する必要があるサービスを書いています。この許可がない発信者を防ぎたくはありません。状況を知りたいだけなので、それに応じて対応できます。ContextメソッドcheckCallingPermission()は私が必要とするものに最適であるように思われ、呼び出し元が指定された権限を持っている場合は0を返し、そうでない場合は-1を返します。ただし、すべての場合で-1が返されることがわかりました。

checkCallingOrSelfPermission()私はテストケースを作成し(システムからパッケージをプルしたのと同様の方法を使用して、PackageInfo各アクセス許可(パッケージに対して要求されたのは1つのみ)を列挙し、結果を表示しました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
4

1 に答える 1

8

アクセス許可を確認する必要があるサービスの範囲内でこれを解決できませんでしたが、サービスの回避策(およびテストケースの問題)を見つけました。

作成して確認したパーミッション「abcd」がAndroidによって<permission>エントリで名前が変更されたため、テストケースは失敗しましたが、Androidは<uses-permission>エントリで同じように名前を変更できませんでした。パッケージ名が付加されるように名前が変更されました(「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())));
于 2012-07-11T15:21:16.870 に答える