Ver Mensaje Individual
  #2  
Antiguo 14-12-2022
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 57
Reputación: 6
dani36652 Va camino a la fama
1- En Android el Almacenamiento interno se describe como "/sdcard"
2- Para hacer uso del almacenamiento interno en Delphi, debe otorgar los permisos al almacenamiento
3- Android 11 y superiores es un caso peculiar, para ello le compartí el link a un repositorio para solventar eso.
4- Le sugiero meter todos sus procesos "pesados" en un Thread Y sincronizar todo lo visual dentro de dicho thread (memos, mensajes, texto en labels, etc); resulta que en Android de no hacerlo, su app parecerá congelada y después se le mostrará el mensaje de "MyApp no responde"....
Le sugiero ver el un ejemplo en este link: https://github.com/dani36652/DelphiThreadLoadingDialog

Finalmente; su app pareciera congelarse por que la ruta de guardado no era la correcta (/user/emulated/0)
en lugar de /sdcard o por que no otorgó los permisos al almacenamiento.
Le hago llegar esta corrección esperando le sea de ayuda:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
  var
  ThreadFTP: TThread;
begin
 ThreadFTP:= TThread.CreateAnonymousThread(
 procedure
 begin
  IdFTP:=TIdFTP.Create(nil);
  IdSSLIO:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  IdFTP.Disconnect();
  {$ifdef mswindows}
  idopensslsetlibpath('C:\Users\usuario.empresa\Desktop\FTPSExample\SSL');
  {$endif}
  {$ifdef android}
  idopensslsetlibpath(TPath.GetDocumentsPath);
  {$endif}
  IdSSLIO.SSLOptions.Method:=TIdSSLVersion.sslvSSLv23;
  IdSSLIO.PassThrough:=true;
  IdFTP.IOHandler:=IdSSLIO;
  IdFTP.ListenTimeout:=10000;
  IdFTP.ReadTimeout:=10000;
  IdFTP.TransferTimeout:=30000;
  IdFTP.ConnectTimeout:=10000;
  IdFTP.Passive:=true;
  IdFTP.UseTLS:=TIdUseTLS.utUseExplicitTLS;
  IdFTP.DataPortProtection:= TIdFTPDataPortSecurity.ftpdpsPrivate;
  IdFTP.Host := '(ip_ftp)';
  IdFTP.Username := '(user)';
  IdFTP.Password := '(pass)';
   try
   IdFTP.Connect;

     try
     {$ifdef mswindows}
     IdFTP.Put('D:\SeLogro.txt','SeLogro.txt',false);
     {$endif}
     {$ifdef android}
     //El almacenamiento interno en Android se describe como /sdcard
     //¡OJO! ACEPTE LOS PERMISOS DE ALMACENAMIENTO Y A PARTIR DE ANDROID 5.0
     //SU APP DEBE PEDIR DICHOS PERMISOS EN TIEMPO DE EJECUCIÓN (ANDROID RUNTIME PERMISSIONS)
     //PARA EL CASO DE ANDROID 11+ NECESITA INSTALAR RAD STUDIO 11 ALEXANDRIA Y APLICAR ESTA
     //SOLUCIÓN QUE DESCRIBO EN EL REPOSITORIO
     //https://github.com/dani36652/Delphi-11-Alexandria-Hacer-uso-del-Almacenamiento-en-Android-11-y-Posteriores
     IdFTP.Put('/sdcard/SeLogro.txt','SeLogro.txt',false);
     {$endif}
      TThread.Synchronize(nil,
      procedure
      begin
      ShowMessage('Ready!');
      end);
     finally
     IdFTP.Disconnect();
     end;
     except
     on E : Exception do
     begin
      TThread.Synchronize(nil,
      procedure
      begin
      ShowMessage('Exception class name = '+E.ClassName);
      ShowMessage('Exception message = '+E.Message);
      end);
     end;
   end;
 end);
 ThreadFTP.FreeOnTerminate:= True;
 ThreadFTP.Start;
end;
Responder Con Cita