Ich aktualisiere unsere App, um das neue M-Laufzeitberechtigungssystem zu verwenden. Es funktioniert alles außer onRequestPermissionsResult (). Ich muss eine Berechtigung bei einem Tastendruck überprüfen und, wenn dies erfolgreich ist, eine Textnachricht senden. Wenn ich die Erlaubnis dazu erteile, wird der Dialog geschlossen, aber der Text senden wird erst ausgelöst, wenn ich die Taste erneut drücke.
Ich habe in der Methode onRequestPermissionsResult () debuggt und Haltepunkte gesetzt, aber es wird nie darauf eingegangen.
Diese Methode wird zuerst aufgerufen:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
Und dann sieht mein Rückruf so aus:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
Ist jemand auf ein ähnliches Problem gestoßen? Schätzen Sie jede Hilfe dabei. Vielen Dank
quelle
Fragment.requestPermissions()
erhält die übergeordnete Aktivität tatsächlich dieonRequestPermissionsResult()
. (Dies ist mit Support-Bibliothek 23.3.0)Sie können dies versuchen:
Wenn Sie diesen Code aus einem Fragment aufrufen, verfügt er über eine eigene requestPermissions-Methode. Ich glaube, das Problem ist, dass Sie statische Methode aufrufen.
Pro Tipp, wenn Sie das
onRequestPermissionsResult()
in einem Fragment wollen:FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
quelle
Ich hoffe es funktioniert gut
Für Aktivität:
Für Fragment:
quelle
Ich bin auch auf dieses Problem gestoßen. Wenn Sie die Aktivität möchten, die Berechtigungen verarbeitet, die nicht im Verlauf / in den letzten Jahren enthalten sind, werden Sie versucht sein, Ihren
AndroidManifest.xml
Eintrag zu ändern .Wenn Sie die Aktivität festlegen, die Sie aufrufen
requestPermissions
oderAppCompatActivity.requestPermissions
mit der Sie arbeitenin deinem
AndroidManifest.xml
dannonRequestPermissionsResult()
wird nicht gerufen. Dies gilt, wenn Ihre Aktivität vonActivity
oder abgeleitet istAppCompatActivity
.Dies kann behoben werden, indem Sie beide Flags aus 'AndroidManifest.xml' entfernen und
finishAndRemoveTask()
stattdessen Ihre Aktivität mit beenden .quelle
Wenn Sie
onRequestPermissionsResult
sowohl Aktivität als auch Fragment haben, stellen Sie sicher, dass Siesuper.onRequestPermissionsResult
Aktivität aufrufen . Es ist nicht in Fragment erforderlich, aber es ist in Aktivität.quelle
FragmentActivity.onRequestPermissionsResult(..)
Hier wird der Aufruf an FragmenteonRequestPermissionsResult(..)
weitergeleitet.Antwort veraltet finden Sie unter: https://developer.android.com/training/permissions/requesting
Innerhalb des Fragments müssen Sie Folgendes aufrufen:
Nicht:
quelle
Wenn Sie requestPermissions in Fragment verwenden, werden 2 statt 3 Parameter akzeptiert.
Du solltest benutzen
requestPermissions(permissions, PERMISSIONS_CODE);
quelle
Wenn Sie aus irgendeinem Grund eine benutzerdefinierte Aktivität in einer externen Bibliothek erweitert haben, die den Super nicht aufruft, müssen Sie das Fragment super.onRequestPermissionsResult in Ihrer Aktivität onRequestPermissionsResult manuell aufrufen.
quelle
Sie haben die Funktion checkPermissions für Geräte vor Marshmallow in FragmentCompat . Ich benutze so:
quelle
Ich habe herausgefunden, dass das wichtig ist, wo Sie anrufen
android.support.v4.app.Fragment.requestPermissions
.Wenn Sie es in tun
onCreate()
,onRequestPermissionsResult()
wird nie aufgerufen.Lösung: Rufen Sie es an
onActivityCreated()
;quelle
onActivityCreated()
meinen Code nicht eingeben. SDK 23.onPause()
?Dieses Problem wurde tatsächlich von NestedFragments verursacht. Grundsätzlich haben die meisten Fragmente ein HostedFragment erweitert, das wiederum ein CompatFragment erweitert. Diese verschachtelten Fragmente verursachten Probleme, die schließlich von einem anderen Entwickler des Projekts gelöst wurden.
Er hat ein paar Sachen auf niedriger Ebene gemacht, wie zum Beispiel Bit-Switching, damit das funktioniert, also bin ich mir der tatsächlichen endgültigen Lösung nicht sicher
quelle
quelle
Das wird funktionieren..
quelle
Wenn Sie diesen Code aus einem Fragment aufrufen, verfügt er über eine eigene requestPermissions-Methode.
Das Grundkonzept lautet also: Wenn Sie sich in einer Aktivität befinden, rufen Sie an
und wenn in einem Fragment, rufen Sie einfach an
quelle
FragmentCompat.requestPermissions()
.Ich hatte ein ähnliches Problem, außer dass ich eine Taste drückte, um einen Anruf zu tätigen, der den callIntent auslöst. Ich habe zuerst die Berechtigung überprüft. Wenn sie nicht erteilt wurde, bitte ich um Erlaubnis und onRequestPermissionResult rufe die Überprüfungsberechtigung auf und rufe erneut auf.
quelle
Basierend auf der Antwort von goodgamerguy lautet die Lösung:
quelle
Bevor Sie alles gemäß den obigen Antworten überprüfen, stellen Sie sicher, dass Ihr Anforderungscode nicht 0 ist !!!
Überprüfen Sie den Code von onRequestPermissionsResult () in FragmentActivity.java:
quelle
quelle
Ich habe eine erstaunliche Lösung, um dies zu erreichen. Machen Sie eine BaseActivity wie diese.
}}
Jetzt können Sie den Code aufrufen, um eine solche Erlaubnis anzufordern
Jedes Mal, wenn dies irgendwo passiert, egal ob in Ihrem Fragment oder in einer Aktivität, wird die Basisaktivität aufgerufen.
Vielen Dank
quelle
Sie können verwenden
requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);
. Verwenden Sie FragmentCompat nicht, wenn Sie v4 verwenden.quelle
Einzelheiten
Algorithmus
Modul - Kamera, Ort, ....
Eigenschaften
Lösung
Verwendung in Aktivität (in Fragment gleich)
quelle
Hier möchte ich meinen Code zeigen, wie ich das geschafft habe.
Hier in dieser Klasse möchte ich überprüfen, ob die Erlaubnis erteilt wurde oder nicht. Ist nicht dann werde ich Erlaubnis von meiner MainActivity wie nennen
Jetzt müssen Sie in der onCreate-Methode die Funktion requestForPermission () aufrufen.
Das war's auch. Sie können mehrere Berechtigungen gleichzeitig anfordern.
quelle
UPDATE: Die Antwort eines anderen über das Aufrufen
super.onRequestPermissionResult()
von Activity wurde angezeigt. Dadurch wurde das von mir erwähnte Problem mit dem Anforderungscode behoben und das onRequestPermissionResult des Fragments aufgerufen.ignoriere dieses Zeug:
Für mich rief es die
onRequestPermissionResult
Aktivität auf, obwohl ich anrieffragment.requestPermission(...)
, ABER es gab das Ergebnis mit einem falschen requestCode zurück (111 wurde zu 65647 warum ??? Ich werde es nie erfahren).Glücklicherweise ist dies die einzige Erlaubnis, die wir auf diesem Bildschirm anfordern, daher ignoriere ich einfach den Anforderungscode (ich habe keine Zeit herauszufinden, warum er momentan nicht korrekt ist).
quelle
Ich habe auch ein Problem festgestellt, dass dieses Problem auch dann auftreten kann, wenn Sie korrekte requestPermissions aufrufen. Das Problem ist, dass übergeordnete Aktivitäten diese Methode möglicherweise überschreiben, ohne super aufzurufen. Füge super hinzu und es wird behoben.
quelle