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  o externo assets.
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');

Relacionados:
-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