El Directorio Home en tus aplicaciones Android





Resultado de imagen de directorio home


Para obtener la carpeta "Home" en rad studio XE10 tendremos que utilizar la función GetHomePath (function GetHomePath: string; static), que está en la unit System.IOutils.


Esta función devuelve la ruta de acceso principal del usuario. Si la llamada a la función genera un error, devolverá una cadena vacía. 


Si queremos guardar un fichero podríamos hacerlo de la siguiente manera:





 TFile.WriteAllText (TPath. GetHomePath () + TPath. DirectorySeparatorChar + 'sample.txt', 'Este es mi texto de ejemplo.');



-Ubicaciones de la ruta home en función del Sistema Operativo.: 

Windows: apunta a la carpeta User's application 

MacOSx: apunta a users home folder, definida por la variable $Home 

IOS y Android: apunta a la localización de la sandbox de la app, que se define para cada instancia de la aplicación y para cada dispositivo IOS.










PlataformaPathPath ID
Windows XPC:\Documents and Settings\Application DataCSIDL_APPDATA
Windows Vistaor laterC:\Documents and Settings\AppData\RoamingFOLDERID_RoamingAppData
Mac OS X/Users/NSUserDirectory
iOS Device/private/var/mobile/Applications/
iOS Simulator/Users/Library/Application Support/iPhone Simulator/Applications/
Android/data/data/filesContext.getFilesDir







System.SysUtils.GetHomePath tiene la misma funcionalidad, pero no se recomienda cuando se está desarrollando apps multidispositivo.





IMPORTANTE:

Cuando desarrollas tu app para Android, si piensas utilizar archivos que se carguen en runtime tienes que utilizar el Deployment Manager para ponerlos en el almacenamiento interno assets\internal
 


AddDBforAndroidAssets.png


Utiliza el siguiente código para localizar archivos en runtime:





TPath.Combine(TPath.GetDocumentsPath, 'filename')  { Interno }
TPath.Combine(TPath.GetSharedDocumentsPath, 'filename') { Externo }








Para Android pon el Remote Path a assets\internal\

Para IOS, pon el Remote Path a StartUp\Documents





EJEMPLOS:




-Guardar un fichero a la sdcard con Android: 
 memo1.lines.savetofile('/sdcard/Download/test.txt'); 





-Guardarlo en la Home


 Memo.Lines.SaveToFile((TPath.GetHomePath ()  + '/test.txt');






-Guardar un fichero en la carpeta Downloads:

Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetDownloadsPath, 'test.txt'));

Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetDownloadsPath, 'test.txt'));





-Leer un documento de la carpeta Documents

System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile'
System.IOUtils.TPath.Combine(System.IOUtils.tpath.getdocumentspath,'prueba.txt'); 





-Listar el contenido de tu device storage folder

P := '/storage/'; 

 if (FindFirst(P + '*', faAnyFile, Sr) = 0) then 

 repeat
Memo1.Lines.Add(Sr.Name);


 until (FindNext(Sr) <> 0);

 FindClose(Sr); 



-Definir la ruta de una Base de datos Interbase en la carpeta Documents



uses System.IOUtils;




procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
SQLConnection1.Params.Values['Database'] := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + ‘BASEDEDATOS.IB’;
end;







-Obtener los archivos de la carpeta assets/internal 

uses
IOUtils
;

procedure THeaderFooterForm.SpeedButton1Click(Sender: TObject);
var
DirList
: TStringDynArray;
DirPath
: string;
s
: string;
begin
DirPath
:= TPath.Combine(TPath.GetDocumentsPath, 'assets');
DirPath
:= TPath.Combine(DirPath, 'internal');

// Display where we're looking for the files
Memo1
.Lines.Add('Searching ' + DirPath);

if TDirectory.Exists(DirPath, True) then
begin
// Get all files. Non-Windows systems don't typically care about
// extensions, so we just use a single '*' as a mask.
DirList
:= TDirectory.GetFiles(DirPath, '*');

// If none found, show that in memo
if Length(DirList) = 0 then
Memo1
.Lines.Add('No files found in ' + DirPath)
else // Files found. List them.
begin
for s in DirList do
Memo1
.Lines.Add(s);
end;
end
else
Memo1
.Lines.Add('Directory ' + DirPath + ' does not exist.');
end;



-Listar archivos de sistema Android en un listbox



uses System.Types, System.IOUtils, System.SysUtils;

procedure AddFiles(MyListBox: TListBox);
var
SDA
: TStringDynArray;
I
, II: Integer;
LBI
: TListBoxItem;
begin
SDA
:= TDirectory.GetFiles(System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim,'*.dat');

for I := Low(SDA) to High(SDA) do
begin
II
:= MyListBox.Items.Add(ExtractFileName(SDA[I]));
LBI
:= MyListBox.ListItems[II];
LBI
.ItemData.Detail := SDA[I];
end;

end;




-Guardar una imagen


procedure TForm1.Button1Click(Sender: TObject);
begin
DocPathLabel.Text := TPath.GetDocumentsPath;
Image1.Bitmap.LoadFromFile(TPath.GetDocumentsPath + PathDelim + 'imagen.jpg');
end;



-Obtener los paths del sistema



uses System.IOUtils;

procedure THeaderFooterForm.Loaded;
begin
inherited Loaded;

TPath
.SetApplicationPath ('WhereAppTest');

add
_path (TPath.GetTempPath, 'GetTempPath');
add
_path (TPath.GetHomePath, 'GetHomePath');
add
_path (TPath.GetDocumentsPath, 'GetDocumentsPath');
add
_path (TPath.GetApplicationPath ('WhereAppTest'), 'GetApplicationPath');
add
_path (TPath.GetSharedDocumentsPath, 'GetSharedDocumentsPath');
add
_path (TPath.GetLibraryPath, 'GetLibraryPath');
add
_path (TPath.GetCachePath, 'GetCachePath');
add
_path (TPath.GetPublicPath, 'GetPublicPath');
add
_path (TPath.GetPicturesPath, 'GetPicturesPath');
add
_path (TPath.GetSharedPicturesPath, 'GetSharedPicturesPath');
add
_path (TPath.GetCameraPath, 'GetCameraPath');
add
_path (TPath.GetSharedCameraPath, 'GetSharedCameraPath');
add
_path (TPath.GetMusicPath, 'GetMusicPath');
add
_path (TPath.GetSharedMusicPath, 'GetSharedMusicPath');
add
_path (TPath.GetMoviesPath, 'GetMoviesPath');
add
_path (TPath.GetSharedMoviesPath, 'GetSharedMoviesPath');
add
_path (TPath.GetAlarmsPath, 'GetAlarmsPath');
add
_path (TPath.GetSharedAlarmsPath, 'GetSharedAlarmsPath');
add
_path (TPath.GetDownloadsPath, 'GetDownloadsPath');
add
_path (TPath.GetSharedDownloadsPath, 'GetSharedDownloadsPath');
add
_path (TPath.GetRingtonesPath.Empty, 'GetRingtonesPath');
add
_path (TPath.GetSharedRingtonesPath, 'GetSharedRingtonesPath');
FMediaPlayer
:= TMediaPlayer.Create(Self);
end; // Loaded //

procedure THeaderFooterForm.add_path (path, header: string);
var
item
: TListViewItem;
bitmap
: TBitmap;
begin
item
:= List_Paths.Items.Add;
item
.ButtonText := 'button';
item
.Detail := path;
item
.Text := header;
end; // add_path //





Página muy útil (recomiendo ponerla en vuestros favoritos)

Path de las funciones RTL standard en función de las distintas plataformas soportadas (Windows, OSx, Android, IOS






Más info: http://docwiki.embarcadero.com/Libraries/XE5/en/System.IOUtils.TPath.GetHomePathDelphi XE5 - deploying and accessing local files on iOS and Android






1 comentario:

  1. Muy bueno el articulo.. les consulto... Cuando intento ejecutar en mi aplicacion delphi -
    android, algunas de las instrucciones que mencionan arriba, como por ejemplo:

    Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetDownloadsPath, 'test.txt'));

    La aplicacion en mi telefono se cierra. Y en mi pc, el debug delphi se detiene, arrojando un error de "Illegal instruccion"

    Saben como podria resolver esto?

    gracias
    Saludos
    Julio

    ResponderEliminar

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...