Firemonkey android read_phone_state runtime permission solicita obtener IMEI - android, delphi, permisos, firemonkey, delphi-10.2-tokyo

¿Cómo puedo obtener el permiso read_phone_state en tiempo de ejecución para obtener el número 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;

Respuestas

3 para la respuesta № 1

EDITAR:Lamento no haber hecho un poco más de tareas en FireMonkey. Esto es lo que me pasa por meterme en temas en los que no debe estar. He añadido este contenido para tratar de que mi respuesta sea más merecedora de la recompensa.

Si puedes restringir el targetSdk en el manifiesto de la aplicación a 22 (5.1 Lollipop), entonces el usuario deberá otorgar el permiso al instalarlo de modo HasPermission nunca debe devolver falso. (No estoy seguro de cómo funciona eso con FireMonkey).

Si desea utilizar las capacidades de permisos dinámicos en Marshmallow +, aquí hay información que obtuve de esta página:

Necesita tener acceso a la Activity método de devolución de llamada onRequestPermissionsResult. Aquí están todos los aros que tendrás que pasar:

  • Usa la herramienta de código abierto Dex2Jar convierte Android classes.dex archivo de Delphi a Java para que pueda compilar contra el FMXNativeActivity clase.
  • Codifique una subclase de FMXNativeActivity en Java que define un native método (vamos a llamarlo onRequestPermissionsResultNative y también anula el onRequestPermissionsResult método para llamar al método nativo.
  • correr javac para obtener un archivo .class con tu subclase
  • correr jar para poner el archivo .class en un archivo .jar
  • correr dx.bat para convertir su archivo .jar en un archivo .dex de Android
  • correr DexMerger para fusionar su archivo .dex en el archivo de classes.dex de Delphi
  • Ahora todo lo que queda por hacer es escribir un código delicado de Delphi para definir su onRequestPermissionsResultNative método y registrarlo con el entorno JNI. Ah, y no te olvides de cambiar al hilo correcto en tu método nativo.

El enlace al que hice referencia muestra cómo hacer esto con onActivityResult. Tendrá que adaptar estos pasos para el otro método.

Y ni siquiera he hablado sobre cómo manejar el sistema operativo pausando su aplicación para pedirle permiso al usuario y reanudarlo después.

Deje que esto sea una lección para todos: no confíe en las herramientas multiplataforma, se sentirá decepcionado.


Trabajo en Java, no en Delphi, así que tendrás que extrapolar un poco aquí.

Al igual que usted, tengo que obtener el número IMEI, y elel cuadro de diálogo del sistema le pregunta al usuario algo como: "¿Permitir que la aplicación realice y administre llamadas telefónicas?" Necesito explicarle al usuario que esa aplicación solo está obteniendo la identificación del dispositivo y que no va a hacer o administrar llamadas telefónicas.

  • Verifica si tienes el permiso
  • Si no tiene el permiso, verifique si debe mostrar una explicación
  • Si no necesita mostrar una explicación, inicie la operación de solicitud de permiso

Debo mencionar eso shouldShowRequestPermissionRationale y requestPermissions son métodos en el Activity clase.

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

En el botón positivo de este cuadro de diálogo (es decir, el usuario quiere continuar) configure el mHasReadRationale marcar como verdadero y llamar doPermissionsStuff de nuevo. (Para cancelar, envío al usuario a la pantalla anterior).

Para obtener el resultado de la requestPermissions operación que necesita para anular el Activity"s onRequestPermissionsResult método:

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

Aparentemente cuando el sistema le pregunta al usuario por elpermiso, detiene su aplicación, por lo que no puede mostrar una IU en ese momento para decirle al usuario que no tiene permiso. Así que establecí una bandera y cuando la aplicación se reanuda, entonces Le digo al usuario que la aplicación no tiene permiso para realizar la operación.

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

Entonces aquí hay un flujo de ejemplo:

  • El usuario quiere una versión de prueba gratuita y la aplicación necesita obtener el IMEI para que no puedan seguir obteniendo la versión de prueba gratuita una y otra vez, ¡por Dios! doPermissionsStuff().
  • Llamadas a la aplicación checkSelfPermission() y determina que el permiso aún no se concede
  • Llamadas a la aplicación shouldShowRequestPermissionRationale(). En mi experiencia, shouldShowRequestPermissionRationale() solo devuelve verdadero después de que el usuario haya denegado el permiso una vez. Por lo tanto, aún no muestra la interfaz de usuario racional al usuario.
  • Llamadas a la aplicación requestPermissions()
  • El sistema le preguntará al usuario "¿Permitir que la aplicación realice y administre llamadas telefónicas?"
  • El usuario decide que esto es WAAAAAAY demasiado aterrador y presiona el botón No.
  • onRequestPermissionsResult() se llama con el resultado de negar y el mPermissionDenied se establece.
  • onResumeFragments() se llama y se muestra un cuadro de diálogo para el usuario que dice que no puede obtener la versión de prueba porque la aplicación no tiene permiso.
  • El usuario decide intentar nuevamente. doPermissionsStuff() se llama.
  • Llamadas a la aplicación checkSelfPermission() y (nuevamente) determina que el permiso aún no se ha otorgado
  • Llamadas a la aplicación shouldShowRequestPermissionRationale(). Esta vez vuelve verdadero.
  • La aplicación muestra un mensaje calmante y calmante parael usuario que no, no vamos a tomar el control de su teléfono, solo queremos el maldito "número IMEI", eso es todo, y si no permite que la aplicación acceda al IMEI, no obtendrá un prueba gratuita. Tengo que trazar la línea algun lado.
  • Las pulsaciones del usuario continúan, entonces el mHasReadRationale bandera se establece en verdadero y doPermissionsStuff() método se llama de nuevo.
  • Llamadas a la aplicación checkSelfPermission() ¿y adivina qué? el permiso todavía no se concede
  • Dado que la bandera está configurada, el usuario no obtiene la IU racional.
  • Llamadas a la aplicación requestPermissions()
  • El sistema le preguntará al usuario "¿Permitir que la aplicación realice y administre llamadas telefónicas?"
  • El usuario renuncia al destino y presiona Sí.
  • onRequestPermissionsResult() se llama con el resultado otorgado y la inscripción de prueba gratuita avanza.

También debe verificar el código de muestra de Google en https://developer.android.com/samples/RuntimePermissions/index.html


preguntas relacionadas
Menú