Android checkCallingOrSelfPermission nicht wieder richtig
Ich Schreibe einen service, der sehen muss, wenn seine Anrufer hält ein bestimmtes eigenes Genehmigung. Ich will nicht, um zu verhindern, dass Anrufer, die ohne diese Erlaubnis, ich will nur wissen, den status, so dass ich entsprechend reagieren können. Es scheint, dass die Kontext-Methode checkCallingPermission()
ist perfekt für das, was ich brauche, Rückgabe 0 wenn der Anrufer die angegebene Berechtigung und -1 sonst. Ich finde, dass -1 zurückgegeben wird, in allen Fällen aber.
Schrieb ich einen test-Fall (mit der ähnlichen Methode checkCallingOrSelfPermission()
wo ich zog mein Paket ist PackageInfo
aus dem system, aufgezählt jede meiner Berechtigungen (nur eine Anfrage nach Paket) und zeigt das Ergebnis der checkCallingOrSelfPermission()
. Da die Berechtigungen, die ich überprüft in diesem Fall sind genau die Berechtigungen, die ich halten, würde ich erwarten, dass checkCallingOrSelfPermission()
auf 0 zurück (PackageManager.PERMISSION_GRANTED) nur... kaufen, es gibt nur -1 (PackageManager.PERMISSION_DENIED).
Habe ich diese überprüft und erhielt die gleichen Ergebnisse auf 4.0 emulator und einem 2.3 Gerät.
Irgendeine Idee, was ich falsch mache, verursachen diese Anrufe zu scheitern?
Meinem test-manifest beinhaltet:
<permission
android:protectionLevel="signatureOrSystem"
android:name="abcd" />
<uses-permission android:name="abcd" />
Meinem test-Aktivität-code:
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();
}
und meine Ergebnisse sind:
D/CHECK ( 3600): abcd -1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nicht lösen konnte, dieses im Rahmen meines service benötigen, um Berechtigungen zu überprüfen, aber ich habe einen work-around für den service (und ein problem in meinem test-Fall).
Meinen Testfall fehlgeschlagen ist, weil die Berechtigung, die ich erstellt und geprüft werden, "abcd", wurde umbenannt von Android in der <Erlaubnis> Eintrag, aber Android konnte nicht gleich benennen Sie es in der <uses-permission - > Eintrag. Es war umbenannt zu haben, meine package-name vorangestellt (und diese Umbenennung tritt nicht auf, wenn ich einen Namen einschließlich einer Periode in der es, wie "test.abcd").
Wenn die änderung der Erlaubnis name festen meinem test-Fall, meine eigentliche Fall innerhalb einer service wurde bereits mit einem voll qualifizierten Erlaubnis name und
checkCallingPermission()
weiterhin nicht. Entdeckte ich jedoch, dass der Paketmanager istcheckPermission()
Methode funktioniert wie erwartet (auf Kosten der mein brauchen, um den Namen des Anrufers-Paket).So zu fassen, der folgende Code funktioniert nicht richtig (obwohl ich nicht weiß, warum):
während dies scheint, um korrekt zu arbeiten: