Firemonkey android read_phone_state Laufzeit Erlaubnis fragt IMEI - Android, Delphi, Berechtigungen, firemonkey, Delphi-10.2-Tokyo

Wie kann ich die Berechtigung read_phone_state zur Laufzeit erhalten, um die IMEI-Nummer zu erhalten?

  if not HasPermission("android.permission.READ_PHONE_STATE") then
begin

//ASK AND GET PERMISSION ?

end;


function TForm1.HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED;


end;

Antworten:

3 für die Antwort № 1

BEARBEITEN:Entschuldigung, ich habe auf FireMonkey keine Hausaufgaben mehr gemacht. Das ist, was ich bekomme, wenn ich meinen Kopf in Themen stecke, in denen es nicht hingehört. Ich habe diesen Inhalt hinzugefügt, um zu versuchen, dass meine Antwort die Prämie verdient.

Wenn Sie das einschränken können targetSdk Auf dem App-Manifest auf 22 (5.1 Lollipop) muss der Benutzer dann die Berechtigung zur Installation erteilen HasPermission sollte nie falsch zurückgeben. (Nicht sicher, wie das mit FireMonkey funktioniert).

Wenn Sie die Funktionen für dynamische Berechtigungen in Marshmallow + verwenden möchten, finden Sie hier einige Informationen diese Seite:

Sie müssen Zugriff auf die haben Activity Rückrufmethode onRequestPermissionsResult. Hier sind alle Reifen, durch die du springen musst:

  • Verwenden Sie das Open-Source-Tool Dex2Jar, um das Android zu konvertieren classes.dex Datei von Delphi zurück nach Java, so dass Sie gegen die kompilieren können FMXNativeActivity Klasse.
  • Code eine Unterklasse von FMXNativeActivity in Java, das a definiert native Methode (nennen wir es onRequestPermissionsResultNative und überschreibt auch die onRequestPermissionsResult Methode zum Aufruf der nativen Methode.
  • Lauf javac um eine .class-Datei mit Ihrer Unterklasse zu erhalten
  • Lauf jar um die .class-Datei in eine .jar-Datei zu stellen
  • Lauf dx.bat um Ihre .jar-Datei in eine Android-.dex-Datei umzuwandeln
  • Lauf DexMerger um Ihre .dex-Datei in die classes.dex-Datei von Delphi einzufügen
  • Jetzt müssen Sie nur noch einen trickreichen Delphi-Code schreiben, um Ihren Code zu definieren onRequestPermissionsResultNative Methode und registrieren Sie es mit der JNI-Umgebung. Oh, und vergiss nicht, auf den richtigen Thread in deiner nativen Methode zu wechseln.

Der Link, auf den ich verwiesen habe, zeigt, wie man das macht onActivityResult. Sie müssen diese Schritte für die andere Methode anpassen.

Und ich habe noch nicht einmal darüber gesprochen, wie man mit dem Betriebssystem umgehen soll, indem man seine App pausiert, um den Benutzer um Erlaubnis zu bitten und danach wieder aufzunehmen.

Lasst das eine Lektion für alle sein: Vertrauen Sie nicht auf plattformübergreifende Werkzeuge, Sie werden enttäuscht sein.


Ich arbeite in Java und nicht in Delphi, also müssen Sie hier ein wenig extrapolieren.

Wie du, muss ich die IMEI Nummer bekommen, und dieDer Systemdialog fragt den Benutzer wie folgt ab: "App erlauben, Telefonanrufe zu tätigen und zu verwalten?" Ich muss dem Benutzer erklären, dass diese App nur die Geräte-ID erhält und keine Telefonanrufe tätigen oder verwalten wird

  • Überprüfen Sie, ob Sie die Erlaubnis haben
  • Wenn Sie die Erlaubnis nicht haben, überprüfen Sie, ob Sie eine Erklärung anzeigen sollten
  • Wenn Sie keine Erklärung anzeigen müssen, starten Sie die Berechtigungsanforderung

Ich sollte das erwähnen shouldShowRequestPermissionRationale und requestPermissions sind Methoden auf der Activity Klasse.

    private static final int READ_PHONE_STATE_PERMISSIONS_REQUEST = 2;

private boolean mHasReadRationale;

void doPermissionsStuff() {
// version checking code omitted, this block runs for marshmallow and later
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
// do the operation that needs the permission here
} else {
// the flag indicates if the rationale dialog has already been displayed
if (! mHasReadRationale && shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
// pop a dialog that explains what"s going on to the user
} else {
requestPermissions(new String[] {Manifest.permission.READ_PHONE_STATE}, READ_PHONE_STATE_PERMISSIONS_REQUEST);
}
}
}

In der positiven Schaltfläche dieses Dialogfelds (d. H. Der Benutzer möchte fortfahren) legen Sie die Option fest mHasReadRationale flag to true und call doPermissionsStuff nochmal. (Für Abbrechen schicke ich den Benutzer zurück zum vorherigen Bildschirm.)

Um das Ergebnis der requestPermissions Operation müssen Sie die überschreiben Activity"s onRequestPermissionsResult Methode:

private boolean mPermissionDenied;

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

switch (requestCode) {
case READ_PHONE_STATE_PERMISSIONS_REQUEST:
// I"m only checking for one permission, so I make assumptions here
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// you can do the operation that needs the permission now
} else {
mPermissionDenied = true;  // set a flag for checking later
}
}
}

Anscheinend fragt das System den Benutzer nach demErlaubnis, stoppt es Ihre App, so dass Sie zu diesem Zeitpunkt keine Benutzeroberfläche anzeigen können, um dem Benutzer mitzuteilen, dass Sie keine Berechtigung haben. Also setze ich eine Flagge und wenn die App wieder läuft, dann Ich sage dem Benutzer, dass die App keine Berechtigung hat, die Operation auszuführen.

@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mPermissionDenied) {
// show dialog to the user that the app can"t do the operation because it doesn"t have permission
mPermissionDenied = false;
}
}

Also hier ist ein Beispielfluss:

  • Benutzer möchte eine kostenlose Testversion & App muss IMEI bekommen, damit sie nicht immer wieder die kostenlose Testversion bekommen, jeez. App-Anrufe doPermissionsStuff().
  • App-Anrufe checkSelfPermission() und bestimmt, dass die Berechtigung noch nicht erteilt wurde
  • App-Anrufe shouldShowRequestPermissionRationale(). Durch meine Erfahrung, shouldShowRequestPermissionRationale() gibt nur true zurück, nachdem der Benutzer die Berechtigung einmal verweigert hat. Daher zeigen Sie dem Benutzer die rationale Benutzeroberfläche noch nicht an.
  • App-Anrufe requestPermissions()
  • Das System fragt den Benutzer "Antrag erlauben, Telefonanrufe zu tätigen und zu verwalten?"
  • Der Benutzer entscheidet, dass WAAAAAAY zu unheimlich ist und drückt die No-Taste.
  • onRequestPermissionsResult() wird mit dem deny-Ergebnis und dem aufgerufen mPermissionDenied wird eingestellt.
  • onResumeFragments() wird aufgerufen und dem Benutzer wird angezeigt, dass er die kostenlose Testversion nicht erhalten kann, da die App keine Berechtigung hat.
  • Der Benutzer entscheidet, es erneut zu versuchen. doPermissionsStuff() wird genannt.
  • App-Anrufe checkSelfPermission() und (wieder) bestimmt die Erlaubnis noch nicht erteilt
  • App-Anrufe shouldShowRequestPermissionRationale(). Diesmal ist es wahr.
  • App zeigt eine beruhigende und beruhigende Nachricht anDer Nutzer, der nicht, wir werden nicht Ihr Telefon übernehmen, wir wollen nur die freakin "IMEI-Nummer, das ist alles, und wenn Sie nicht zulassen, dass die App auf die IMEI zugreifen, erhalten Sie nicht kostenlose Testversion Ich muss die Grenze ziehen irgendwo.
  • Benutzer drückt weiter, so dass der mHasReadRationale Flag ist auf wahr und gesetzt doPermissionsStuff() Methode wird erneut aufgerufen.
  • App-Anrufe checkSelfPermission() und rate was? die Erlaubnis ist noch nicht erteilt
  • Da das Flag gesetzt ist, erhält der Benutzer die rationale UI nicht.
  • App-Anrufe requestPermissions()
  • Das System fragt den Benutzer "Antrag erlauben, Telefonanrufe zu tätigen und zu verwalten?"
  • Der Benutzer tritt sich selbst zum Schicksal und drückt Ja.
  • onRequestPermissionsResult() wird mit dem gewährten Ergebnis aufgerufen und die kostenlose Testanmeldung geht weiter.

Sie sollten auch den Beispielcode von Google unter https://developer.android.com/samples/RuntimePermissions/index.html


Verwandte Fragen