我正在編寫一個服務,需要查看其調用者是否擁有特定的私人權限。我不想阻止那些缺乏這種許可的呼叫者,我只想知道狀態,以便我可以做出相應的反應。看起來Context方法checkCallingPermission()
對我所需要的是完美的,如果調用者具有指定的權限則返回0,否則返回-1。我發現在所有情況下都返回-1。Android checkCallingOrSelfPermission沒有正確返回
我寫測試用例(使用類似的方法checkCallingOrSelfPermission()
其中我把我的包的PackageInfo
從系統,列舉每個我的權限(只有一個請求爲包)的,並顯示checkCallingOrSelfPermission()
結果。由於權限我「M反對在這種情況下檢查是否完全握住我的權限,我希望checkCallingOrSelfPermission()
只返回0(PackageManager.PERMISSION_GRANTED)......買它只返回-1(PackageManager.PERMISSION_DENIED)。
我檢查這在4.0模擬器和2.3設備上都得到了相同的結果。
任何想法wha我做錯了,導致這些電話失敗?
我的測試清單包括:
<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