発信者が特定の個人的な許可を持っているかどうかを確認する必要があるサービスを書いています。この許可がない発信者を防ぎたくはありません。状況を知りたいだけなので、それに応じて対応できます。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