Ver Mensaje Individual
  #1  
Antiguo 17-09-2023
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Reputación: 17
jhonalone Va por buen camino
Leer imagen de la carpeta Pictures de Android

Hola a todos. Un saludo porque hace mucho que no nos comunicamos.
Requiero vuestra colaboración una vez más. Me explico.
Mi intención es incorporar un icono que he copiado previamente desde Windows por USB en la carpeta Pictures, a mi app.

Tengo entendido algunas cosas (que alguien me corrija si me equivoco, por favor)
1.- Desde Android 11 sólo se pueden leer los archivos que ha creado tu app.
2.- Se han creado nuevos permisos a partir de Android 13
3.- Habilitando el permiso MANAGE_EXTERNAL_STORAGE te prmite leer todos los archivos. (Esto lo he leído en las instrucciones de Google para desarrolladores)

La cuestión es que (como Google sigue poniendo cada vez mas trabas en Play Store), tengo que qctualizar las app's que tengo publicadas.

Concretamente tengo una app que permitía al usuario personalizar el icono de la misma.
El procedimiento era sencillo: el usuario copiaba su icono desde Windows en la carpeta Pictures de su dispositivo, y el programa lo leía y lo incorporaba a la app.

Esto ha funcionado perfectamente, (no se hasta qué versión, creo que es la 10). Tengo un dispositivo con la versión 9 y funciona perfecto.

Tengo otro disposistivo con la versión 13 y ya no funciona.

¡PERDÓN POR EXTENDERME!

He modificado el código para adaptarlo a la versión 13 y posteriores (si no cambia Google).

Éste es el código que utilizo:

Código Delphi [-]
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListBox,
  FMX.StdCtrls, FMX.Effects, FMX.Edit, FMX.Objects, FMX.Controls.Presentation,
  FMX.Layouts, System.IOUtils, System.UIConsts, FMX.Helpers.Android,
  System.Permissions, Androidapi.Helpers, Androidapi.JNI.Os, // Para los nuevos permisos
  FMX.Media,
  DW.Consts.Android, DW.Permissions.Helpers;  // Para los nuevos permisos de KastriFree

......................................................................................

const
  Read_Video = 'android.permission.READ_MEDIA_VIDEO';
  Read_Imagen   = 'android.permission.READ_MEDIA_IMAGES';
  Read_Media_Visual =  'android.permission.READ_MEDIA_VISUAL_USER_SELECTED';
  Read_External_Storage = 'android.permission.MANAGE_EXTERNAL_STORAGE';

.................................................................................................
procedure TLogo.Button1Click(Sender: TObject);
var
   DataFile : String;
   MiMap: FMX.Graphics.TBitmap;
   Permitido : Boolean;

begin

if TOSVersion.Check(13)  // antes de la versión 13 creo que no existen estos permisos
then
  PermissionsService.RequestPermissions([Read_Video, Read_Imagen, Read_Media_Visual, Read_External_Storage],
  procedure(const APermissions: TPermissionArray; const AGrantResults: TPermissionStatusArray)
  begin
//  ShowMessage( Length(AGrantResults).ToString);
   if (Length(AGrantResults) = 4)
   then begin
        // ShowMessage('Se aceptaron todos los permisos.');
        end
   else begin
        Mensaje('Si no concede permiso para leer el fichero Icono144x144.bmp, que debería '+
                'haber copiado en la carpeta Pictures de su dispositivo, no podremos '+
                'cambiar el logotipo de su aplicación.', 0);
        Exit;
        end;

  end
  ); // fin permissions

// Si concedió los permisos o si es una versión anterior a la 13  continuamos...

  DataFile := TPath.Combine(TPath.GetSharedPicturesPath, 'Icono144x144.bmp');
  if not FileExists(DataFile)
  then begin
       Mensaje('No se encuentra el fichero "Icono144x144.bmp" en la carpeta "Pictures" de su dispositivo.', 0);
       exit;
       end
  else begin
         Edit1.Text := 'Icono144x144.bmp';
     //    try  // Comentando try para ver el error
           MiMap := FMX.Graphics.TBitmap.Create();
           MiMap.LoadFromFile(DataFile); // Aquí está el error "Acceso denegado"
     //    except
              begin
               Mensaje('No se puede leer el archivo "Icono144x144.bmp" o tiene un formato erróneo.', 0);
               MiMap.Free;
               Exit;
              end;
     //    end; //try

         if (MiMap.Height<>144) or (MiMap.Width<>144)
         then begin
              Mensaje('Ajuste el tamaño de la imagen a 144 por 144 pixeles y vuelva a intentarlo.', 0);
              MiMap.Free;
              exit;
             end;
         Image1.Bitmap := MiMap;
         MiMap.Free;
       end;
end; //Button1Click

He comentado el try para ver el error que lanza Android y he obtenido que aunque reconoce que el archivo del icono está ahí, pero responde que "Permission denied" para leerlo.

No sé si esto tiene alguna solución. Os comento que llevo ya una semana buscando y leyendo cosas, pero no he encontrado nada que lo resuelva. Lo más cercano es el permiso de MANAGE_EXTERNAL_STORAGE que, si lo subo a Play Store, creo que lo tiene que autorizar Google. Pero supongo que en la opción Release/Deployment no tendría que autorizarlo.

LOS 4 PERMISOS HAN SIDO GRANTED, AUNQUE NO HA PEDIDO LOS PERMISOS.

Perdón por haberme extendido, pero como dice Germán (Neftalí) " Más tiempo dedicado a la pregunta=Mejores respuestas. "

Gracias de antemano por leerme y por intentar ayudarme.

Un saludo muy afectuoso.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)
Responder Con Cita