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}
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;