Firemonkey android read_phone_state autorizzazione di runtime chiede di ottenere IMEI - android, delphi, permessi, firemonkey, delphi-10.2-tokyo

Come posso ottenere l'autorizzazione read_phone_state in fase di runtime per ottenere il numero IMEI?

  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;

risposte:

3 per risposta № 1

MODIFICARE:Mi spiace di non aver fatto un po 'di compiti in più su FireMonkey, questo è ciò che ottengo per avermi messo in discussione su argomenti a cui non appartiene. Ho aggiunto questo contenuto per cercare di rendere la mia risposta più meritevole della ricompensa.

Se puoi limitare il targetSdk sul manifest dell'app a 22 (5.1 Lollipop) quindi l'utente dovrà concedere l'autorizzazione all'installazione così HasPermission non dovrebbe mai restituire falso. (Non sono sicuro di come funzioni con FireMonkey).

Se si desidera utilizzare le funzionalità di autorizzazioni dinamiche in Marshmallow +, ecco alcune informazioni che ho ricavato da questa pagina:

Devi avere accesso a Activity metodo di callback onRequestPermissionsResult. Ecco tutti i cerchi che dovrai superare:

  • Utilizza lo strumento open source Dex2Jar per convertire l'Android classes.dex file da Delphi a Java in modo da poter compilare il file FMXNativeActivity classe.
  • Codice una sottoclasse di FMXNativeActivity in Java che definisce a native metodo (chiamiamolo onRequestPermissionsResultNative e sovrascrive anche il onRequestPermissionsResult metodo per chiamare il metodo nativo.
  • correre javac per ottenere un file .class con la sottoclasse
  • correre jar per inserire il file .class in un file .jar
  • correre dx.bat per trasformare il tuo file .jar in un file .dex Android
  • correre DexMerger per unire il tuo file .dex nel file classes.dex di Delphi
  • Ora tutto ciò che resta da fare è scrivere un codice Delphi complicato per definire il tuo onRequestPermissionsResultNative metodo e registrarlo con l'ambiente JNI. Oh, e non dimenticare di passare al thread corretto nel tuo metodo nativo.

Il collegamento a cui ho fatto riferimento mostra come farlo con onActivityResult. Dovrai adattare questi passaggi per l'altro metodo.

E non ho nemmeno parlato di come gestire il sistema operativo mettendo in pausa la tua app per chiedere l'autorizzazione all'utente e riprenderla dopo.

Lascia che sia una lezione per tutti: non fidarti degli strumenti multipiattaforma, rimarrai deluso.


Lavoro in Java e non in Delphi, quindi dovrai estrapolare un po 'qui.

Come te, devo ottenere il numero IMEI e illa finestra di dialogo del sistema chiede all'utente qualcosa come: "Consenti all'app di effettuare e gestire le chiamate telefoniche?" Devo spiegare all'utente che l'app sta ricevendo l'ID del dispositivo e non sta effettuando o gestendo le chiamate.

  • Controlla se hai il permesso
  • Se non hai il permesso, controlla se dovresti mostrare una spiegazione
  • Se non è necessario mostrare una spiegazione, avviare l'operazione di richiesta di autorizzazione

Dovrei dirlo shouldShowRequestPermissionRationale e requestPermissions sono metodi sul Activity classe.

    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);
}
}
}

Nel pulsante positivo di questa finestra di dialogo (vale a dire che l'utente desidera continuare) imposta il comando mHasReadRationale contrassegna su true e chiama doPermissionsStuff ancora. (Per Annulla, rimando l'utente alla schermata precedente.)

Al fine di ottenere il risultato del requestPermissions operazione è necessario sovrascrivere il Activity"S onRequestPermissionsResult metodo:

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
}
}
}

Apparentemente quando il sistema chiede all'utente dipermesso, interrompe la tua app, quindi non puoi mostrare un'interfaccia utente a quel punto per dire all'utente che non hai il permesso. Così ho impostato una bandiera e quando l'app riprende, poi Dico all'utente che l'app non ha il permesso di eseguire l'operazione.

@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;
}
}

Quindi ecco un esempio di flusso:

  • L'utente vuole una prova gratuita e l'app ha bisogno di ottenere IMEI in modo che non possano continuare a ottenere la prova gratuita più e più volte, jeez. doPermissionsStuff().
  • Chiamate App checkSelfPermission() e determina che il permesso non è ancora stato concesso
  • Chiamate App shouldShowRequestPermissionRationale(). Nella mia esperienza, shouldShowRequestPermissionRationale() restituisce true solo dopo che l'utente ha negato l'autorizzazione una volta. Quindi non visualizzi ancora l'interfaccia utente razionale.
  • Chiamate App requestPermissions()
  • Il sistema chiederà all'utente "Consenti all'applicazione di effettuare e gestire le chiamate telefoniche?"
  • L'utente decide che questo è WAAAAAAY troppo spaventoso e preme il pulsante No.
  • onRequestPermissionsResult() viene chiamato con il risultato di negazione e il mPermissionDenied viene impostato.
  • onResumeFragments() viene chiamato e viene visualizzata una finestra di dialogo per l'utente che non può ottenere la prova gratuita perché l'app non ha il permesso.
  • L'utente decide di riprovare. doPermissionsStuff() è chiamato.
  • Chiamate App checkSelfPermission() e (di nuovo) determina che il permesso non è ancora stato concesso
  • Chiamate App shouldShowRequestPermissionRationale(). Questa volta restituisce il vero.
  • App visualizza un messaggio calmante e rilassante perl'utente che no, non ci occuperemo del telefono, vogliamo solo il numero IMEI, questo è tutto, e se non permetti all'applicazione di accedere all'IMEI, non otterrai un prova gratuita. Devo tracciare la linea da qualche parte.
  • Le presse degli utenti continuano, quindi il mHasReadRationale flag è impostato su true e doPermissionsStuff() il metodo viene chiamato di nuovo.
  • Chiamate App checkSelfPermission() e indovina cosa? il permesso non è ancora concesso
  • Poiché il flag è impostato, l'utente non ottiene l'interfaccia utente razionale.
  • Chiamate App requestPermissions()
  • Il sistema chiederà all'utente "Consenti all'applicazione di effettuare e gestire le chiamate telefoniche?"
  • L'utente si abbandona al destino e preme Sì.
  • onRequestPermissionsResult() viene chiamato con il risultato concesso e la registrazione di prova gratuita va avanti.

Dovresti anche controllare il codice di esempio di Google all'indirizzo https://developer.android.com/samples/RuntimePermissions/index.html


domande correlate
Menu