Ver Mensaje Individual
  #13  
Antiguo 14-03-2019
Avatar de turbopascual5.0
turbopascual5.0 turbopascual5.0 is offline
Miembro
 
Registrado: feb 2011
Posts: 54
Reputación: 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