Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2019
Avatar de turbopascual5.0
turbopascual5.0 turbopascual5.0 is offline
Miembro
 
Registrado: feb 2011
Posts: 54
Poder: 14
turbopascual5.0 Va por buen camino
Cita:
Empezado por cocute Ver Mensaje
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

Última edición por Casimiro Notevi fecha: 15-03-2019 a las 00:08:42.
Responder Con Cita
  #2  
Antiguo 14-03-2019
Avatar de turbopascual5.0
turbopascual5.0 turbopascual5.0 is offline
Miembro
 
Registrado: feb 2011
Posts: 54
Poder: 14
turbopascual5.0 Va por buen camino
Los administradores me van a crujir, pero juro que puese las etiquetas de código.
Responder Con Cita
  #3  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #4  
Antiguo 15-03-2019
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por turbopascual5.0 Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por cocute Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 15-03-2019
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #7  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué versión es tu android?
Responder Con Cita
  #8  
Antiguo 16-03-2019
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿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)

Última edición por cocute fecha: 16-03-2019 a las 12:25:33.
Responder Con Cita
  #9  
Antiguo 16-03-2019
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
intentando resumir a lo más mínimo el código necesario, poniendo sólo esto me funciona en rio el permiso de escritura/lectura y lo deja guardado

Código Delphi [-]
uses
  System.Permissions,
{$IFDEF ANDROID}
  Androidapi.JNI.Os,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
{$ENDIF}
  FMX.DialogService;


y metiendo esto en el form create

begin
   PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
    procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
    begin
    end);
    PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
    procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
    begin
    end)
end;

seguro que aun se puede resumir más el código quitando la parte de los dos procedures, pero no se que poner en su cuenta
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Permisos NTFS johncook API de Windows 0 24-07-2006 17:05:33
Permisos de IBConsole Novata2006 Firebird e Interbase 0 12-05-2006 13:26:06
Permisos en Interbase federiconqn21 Conexión con bases de datos 1 06-02-2006 16:15:20
Control de Permisos con ADO Migpal MS SQL Server 4 08-11-2005 08:27:50
permisos de red nicocer API de Windows 2 18-06-2004 20:17:46


La franja horaria es GMT +2. Ahora son las 23:16:55.


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