Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   permisos en rio (https://www.clubdelphi.com/foros/showthread.php?t=93799)

cocute 09-03-2019 22:09:43

permisos en rio
 
tengo una aplicación android
que en tokio no me daba problemas,
le daba permisos de lectura y escritura porque leo/escribo un fichero de texto,
pero al compilar en RIO no me van los permisos, tengo que poner los permisos a mano en mi móvil de Memoria o algo así,
que es el único permiso que me deja activar,

sabéis qué es lo que han cambiado? y que permiso debería activar?

gracias

turbopascual5.0 10-03-2019 10:24:06

La política de permisos ha cambiado, apartir de oreo (creo) hay unos permisos "peligrosos".

Read/write externar storage está en la lista de peligrosos, y el usuario los ha de autorizar explícitamente.

Hay dos formas, a mano, tal como lo haces ahora, o comprobar los permisos en tiempo de ejecución.

Yo solo lo he implementado para llamadas telefónicas, tengo otra aplicación que sí usa external storage pero todavía no me he metido con ella. En las demos que te instala con río hay una aplicación, phonedialer, ahí miré como hacerlo. No sé si para rewad/write hay una, échale un vistazo.

WHILENOTEOF 11-03-2019 09:47:45

En un reciente webminar se comentó la nueva política de permisos de Android y como implementarlo en Delphi, este es el enlace : http://delphi.org/2019/02/get-the-mo...with-10-3-rio/ , a partir del 20:30 está el tema de los permisos.

cocute 11-03-2019 14:48:22

yo creo que voy a volver a Tokio,
además en rio me va toda la interface muy lenta y no encuentro las cosas,
simplemente para meter una path de una librería con lo que se usa no lo han podido esconder más.

cocute 11-03-2019 18:30:30

Cita:

Empezado por WHILENOTEOF (Mensaje 530993)
En un reciente webminar se comentó la nueva política de permisos de Android y como implementarlo en Delphi, este es el enlace : http://delphi.org/2019/02/get-the-mo...with-10-3-rio/ , a partir del 20:30 está el tema de los permisos.

lo he visto pero no me queda claro que es lo que hay que hacer,
hay que meter código a mano sobre los permisos?
no se puede como antes simplemente marcar la casilla del permiso que quieres que se active?
aunque luego al que lo instala se le pregunte al instalar si lo acepta?

gracias

cocute 11-03-2019 20:37:25

por cierto otra duda, no entiendo porque si compilo mi aplicacion con Tokio, aun usando el mismo SDK 28 que en rio,
al inicial la aplicación en un movil que tiene android9 la primera vez me aparece un mensaje como que la aplicación ha sido creada para una versión anterior de Android.

turbopascual5.0 12-03-2019 09:23:41

Cita:

Empezado por cocute (Mensaje 531002)
lo he visto pero no me queda claro que es lo que hay que hacer,
hay que meter código a mano sobre los permisos?
no se puede como antes simplemente marcar la casilla del permiso que quieres que se active?
aunque luego al que lo instala se le pregunte al instalar si lo acepta?

gracias

Sí, hay que meterlo a mano. Si no lo metes no se preguntará nada, al llegar al código donde, por ejemplo, se ha de realizar una llamada telefónica, tendrás un mensaje diciendo que el permiso no está garantizado y que no puede realizar la acción.

Las casillas las has de seguir marcando.

Solo tienes dos opciones, o no pones el código y cuando instales la aplicación vas a aplicaciones, configuración, permisos y activas los permisos, o lo pones.

Ya he implementado los permisos en la apli que comentaba post anteriores, para acceder a permisor read, write, external storage. Ahora no lo tengo a mano, esta noche te puedo decir el código y donde hay que ponerlo.

Un saludo

turbopascual5.0 12-03-2019 09:26:26

Cita:

Empezado por cocute (Mensaje 531008)
por cierto otra duda, no entiendo porque si compilo mi aplicacion con Tokio, aun usando el mismo SDK 28 que en rio,
al inicial la aplicación en un movil que tiene android9 la primera vez me aparece un mensaje como que la aplicación ha sido creada para una versión anterior de Android.

Tokio tiene un bug y en el manifest siempre pone que el sdk target es api 14.

Y olvida subir una aplicación hecha en Tokio al store, te dirá que la api mínima es (creo) 26 , ahora no estoy seguro si 23 , o 26, pero da igual, tu manifest dirá que la estás enviando a 14...

Casimiro Notevi 12-03-2019 10:03:28

Cita:

Empezado por turbopascual5.0 (Mensaje 531013)
la api mínima es (creo) 26

Eso es así para todo el mundo, con todos los programas.

cocute 13-03-2019 09:04:08

Cita:

Empezado por turbopascual5.0 (Mensaje 531013)
Tokio tiene un bug y en el manifest siempre pone que el sdk target es api 14.

Y olvida subir una aplicación hecha en Tokio al store, te dirá que la api mínima es (creo) 26 , ahora no estoy seguro si 23 , o 26, pero da igual, tu manifest dirá que la estás enviando a 14...

No me queda otra que seguir en Tokio de momento,
Ya que al intentar recompilar mi aplicación en RIO no soy capaz de que funcione bien del todo, aparte de los permisos me da más errores.
Bueno una vez ajustado error no da pero la aplicación no hace lo que debe de hacer,

Anteriormente cada vez que sacaban una versión nueva de Delphi al recompilar mis aplicaciones android notaba mejora arrancando más rápido,
con Rio ya eso no se ve ninguna mejora, y lo que he comentado antes al cambio de interface no me termino de hacer.

Sobre Tokio usas la última versión 10.2.3 build 3231?
esta es la última no?
https://cc.embarcadero.com/item/30842

turbopascual5.0 13-03-2019 09:13:15

Cita:

Empezado por cocute (Mensaje 531027)
No me queda otra que seguir en Tokio de momento,
Ya que al intentar recompilar mi aplicación en RIO no soy capaz de que funcione bien del todo, aparte de los permisos me da más errores.
Bueno una vez ajustado error no da pero la aplicación no hace lo que debe de hacer,

Anteriormente cada vez que sacaban una versión nueva de Delphi al recompilar mis aplicaciones android notaba mejora arrancando más rápido,
con Rio ya eso no se ve ninguna mejora, y lo que he comentado antes al cambio de interface no me termino de hacer.

Si son aplicaciones que instalas en tu móvil por cable, y les pones los permisos a mano, no hay problema. Una vez que hayas dado los permisos no te los volverá a pedir aunque recompiles y vuelvas a pasarla al móvil. Lo del store sí lo tendrás mal. Había alguna info por la web sobre como salvar el tema del bug de la api en Tokio, pero la verdad, lo vi tan complicado que se me escapaba de mi nivel.

A mi rio me va fluido, I7, 16 GB ram.

Un saludo

cocute 13-03-2019 17:20:28

Y no existe algún componente o alguna utilidad que se añada al IDE o algo así que facilite lo de añadir esto de los permisos en las aplicaciones android?

turbopascual5.0 14-03-2019 23:11:23

Cita:

Empezado por cocute (Mensaje 531033)
Y no existe algún componente o alguna utilidad que se añada al IDE o algo así que facilite lo de añadir esto de los permisos en las aplicaciones android?

No , no existe.
Pero es fácil.
En primer lugar activa secure file sharing , en entitlement list, aquí tienes como:
http://blong.com/Articles/AndroidPer...ureFileSharing
Esto añadirá en el manifest un apartado de provider.
Ahora el código delphi:

Código Delphi [-]
 private
    FPermissionReadExternalStorage,
    FPermissionWriteExternalStorage: string;
    procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
    procedure AccessExternalStoragePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  HeaderFooterForm: THeaderFooterForm;

implementation
uses
{$IFDEF ANDROID}
{  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os,}
 {$ENDIF  ANDROID}
  FMX.DialogService;

{$R *.fmx}
{$R *.Windows.fmx MSWINDOWS}
{$R *.NmXhdpiPh.fmx ANDROID}
{$R *.LgXhdpiTb.fmx ANDROID}

procedure theaderfooterform.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
var
  I: Integer;
  RationaleMsg: string;
begin

  for I := 0 to High(APermissions) do
  begin
      if APermissions[i] = FPermissionReadExternalStorage then
      RationaleMsg := RationaleMsg + 'La aplicación necesita permiso para acceder al almacenamiento.';
  end;
   // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
  // After the user sees the explanation, invoke the post-rationale routine to request the permissions
  TDialogService.ShowMessage(RationaleMsg,
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)

end;

procedure theaderfooterform.AccessExternalStoragePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray);
begin

  // 2 permissions involved: READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE
  if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted)  then
   begin
   //aquí iría el código si la autorización es correcta.

   end
  else
   begin
    //los permisos no estan autorizados, presentamos un mensaje. FALTA: Implementar panel con el mensaje y botón para raise.
    TDialogService.ShowMessage('La aplicación no puerde continuar porque no tiene los permisos necesarios.')
   end;

end;

Y en evento form create:

Código Delphi [-]
{$IFDEF ANDROID}
  FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
  FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
  PermissionsService.RequestPermissions([FPermissionReadExternalStorage, FPermissionWriteExternalStorage],   AccessExternalStoragePermissionRequestResult, DisplayRationale);

 {$ENDIF}

La comprobación de permisos se hace en :

Código:

  PermissionsService.RequestPermissions([FPermissionReadExternalStorage,  FPermissionWriteExternalStorage],    AccessExternalStoragePermissionRequestResult, DisplayRationale);
No es necesario que esté en form create, la llamada la puedes hacer en cualquier punto del programa, yo la he puesto para que se inicie nada más arrancar el programa porque me gusta que los permisos se pidan al principio.

Fíjate en un detalle, en la parte de código:

Código Delphi [-]
   //aquí iría el código si la autorización es correcta.

   end
  else
   begin
    //los permisos no estan autorizados,
    TDialogService.ShowMessage('La aplicación no puerde continuar porque no tiene los permisos necesarios.')

El planteamiento es que donde hago el comentario // aquí iría el código si la autorización es correcta, pondrías el código que accede al almacenamiento externo.

Y donde pone TDialogService.ShowMessage('La aplicación no puerde continuar porque no tiene los permisos necesarios.')
pondías el mensaje tipo , "el permiso de acceso al almacenamiento no está autorizado" .

La aplicación puede seguir funcionando sin los permisos, porque los va a comprobar cada vez y si no los autorizas no ejecutará el código.

Como mi aplicación accede a unas bases de datos en la nube y sin esos datos no vale para nada...... los pido al inicio y si no los autorizas cierro la aplicación.

Espero te sea de ayuda, al principio es bastante abrumador, a mi me pasó, pero ya ves que es sencillo.

Para llamadas de teléfono y acceso a la cámara tienes ejemplos en las demos que se instalan con rio. El código que te he puesto para acceso a almacenamiento externo está sacado de la demo de acceso a cámara, que necesita tres permisos, read/write external storage y cámera.

Un saludo

turbopascual5.0 14-03-2019 23:13:13

Los administradores me van a crujir, pero juro que puese las etiquetas de código.

Casimiro Notevi 15-03-2019 00:10:00

^\||/^\||/^\||/

cocute 15-03-2019 12:25:01

Cita:

Empezado por turbopascual5.0 (Mensaje 531080)
Pero es fácil.

pues yo no lo veo tan fácil,
he intentado meter todo eso en mi programa pero no me funcionaba me daba un montón de errores,
si hay que hacer todo eso cada vez que quieres meter un permiso un programa ya digo que sigo en Tokio

Casimiro Notevi 15-03-2019 12:46:01

Cita:

Empezado por cocute (Mensaje 531086)
pues yo no lo veo tan fácil,
he intentado meter todo eso en mi programa pero no me funcionaba me daba un montón de errores,
si hay que hacer todo eso cada vez que quieres meter un permiso un programa ya digo que sigo en Tokio

El problema no es tokio, rio, etc. sino que google cambió a partir de android 6.1 (sdk 26) la obligación de pedir permisos para ciertas cosas.
Y además, si quieres subir tu software a la "google play store" necesitas por obligación, también, sdk26 en adelante.

cocute 15-03-2019 19:44:45

Cita:

Empezado por Casimiro Notevi (Mensaje 531087)
El problema no es tokio, rio, etc. sino que google cambió a partir de android 6.1 (sdk 26) la obligación de pedir permisos para ciertas cosas.
Y además, si quieres subir tu software a la "google play store" necesitas por obligación, también, sdk26 en adelante.


Pero si yo compilo con Tokio con la API 28.0.3 e instalo la aplicación en mi móvil me pilla los permisos sin problemas sin tener que activarlos a mano y sin meter ningún código a mano.

Aunque no he probado a subir esa apk a la market Ya que hay apps que hago que me da igual que no estén en la market.

Esto con Rio no se puede

Casimiro Notevi 15-03-2019 21:01:21

¿Qué versión es tu android?

cocute 16-03-2019 12:17:19

Cita:

Empezado por Casimiro Notevi (Mensaje 531104)
¿Qué versión es tu android?

Android 9.0 en el mate10

La primera vez que ejecuto la apk me sale un mensaje de algo como si estuviese hecho para un android anterior, pero ya no sale las siguientes veces ni da más problema.
(pero ya digo que compilo con Tokio con la api 28.0.3)


La franja horaria es GMT +2. Ahora son las 02:50:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi