Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   ¿Es posible grabar y leer ficheros en la SD card? (https://www.clubdelphi.com/foros/showthread.php?t=91059)

jhonalone 01-11-2016 20:16:18

¿Es posible grabar y leer ficheros en la SD card?
 
Hola compañeros.

Llevo ya unos cuantos días buscando la manera de salvar un fichero de texto en la SD card y recuperarlo después.

He buscado en el foro, en StackOverflow, en los foros de Embarcadero... en Google... y nada.

Unos dicen que comenzando la ruta por '/sdcard/...., Otros que utilizando TPath.Get....

Nada, he probado de todo y nada...

Una vez me pareció que había encontrado la solución. Utilicé la siguiente ruta y no me dio error al grabarlo:

Código Delphi [-]
DataFile := TPath.Combine('/sdcard/Android/data/com.embarcadero..../files/',  'Prueba.txt');

Me puse como loco y fui a comprobarlo inmediatamente. El directorio indicado de la SD estaba vacío...

Seguí buscando y buscando en la tarjeta y en el teléfono y mi gran sorpresa fue que ¡¡ lo encontré en el directorio del mismo nombre, pero en el teléfono!!...

Me eché las manos a la cabeza y todavía estoy pensando, ¿cómo es posible que el dispositivo haya ignorado la primera parte de la ruta, o sea donde dice "/sdcard"

Seguiré buscando, ya que me resulta muy extraño que Embarcadero no haya facilitado esta posibilidad, (si es que existe).

Si alguien lo ha conseguido, por favor, dígamelo. Y si alguien sabe que no es posible, por favor, también. Y dejo de volverme loco buscando.

Perdonar que os importune con estas cuestiones, que seguramente serán vanas e irrelevantes para la mayoría de vosotros.

Saludos para todos.

jhonalone 01-11-2016 21:00:15

Hola.
Acabo de leer aquí que existe la posibilidad que pretendo en Android. Otra cosa es si se puede desde Delphi y cómo se hace.
Saludos.

jhonalone 02-11-2016 00:26:20

Hola de nuevo, compañeros.

SOLUCIONADO.

Por si a alguien le interesa.
La DIRECCION de la tarjeta SD para leer y escribir datos es la siguiente:
Código Delphi [-]
DataFile := TPath.Combine('/storage/extSdCard/Android/data/com.(tu Packeage).(Nombre del proyecto)/files/',  'NombreDelFichero.Extensión');

Seguramente el único que no lo sabía era yo. Aquí lo dejo por si alguno está tan despistado como un servidor.

Gracias por leerme.
Saludos para todos.

jhonny 02-11-2016 12:16:21

Hola, ¿Probaste de pronto así?

Código Delphi [-]
DataFile := TPath.Combine(TPath.GetSharedDocumentsPath, 'NombreDelFichero.Extensión');

jhonalone 02-11-2016 16:38:40

Hola Jhonny.
En esa dirección es donde yo estaba grabando los ficheros antes de decidir grabarlos en la SD.
Ésa dirección apunta a la carpeta \GT-I9195\Phone\Documents, que utiliza el espacio de almacenamiento de tu teléfono. GT-I9195 es el identificador de tu teléfono. Copruebalo y me cuentas.
Saludos cordiales.

jhonny 02-11-2016 19:04:45

Cita:

Empezado por jhonalone (Mensaje 510359)
Hola Jhonny.
En esa dirección es donde yo estaba grabando los ficheros antes de decidir grabarlos en la SD.
Ésa dirección apunta a la carpeta \GT-I9195\Phone\Documents, que utiliza el espacio de almacenamiento de tu teléfono. GT-I9195 es el identificador de tu teléfono. Copruebalo y me cuentas.
Saludos cordiales.

Ahhh ya, es verdad, no había caído en cuenta, es que TPath.GetSharedDocumentsPath es la carpeta compartida externa a la app, pero sigue estando en la memoria interna del teléfono y no la SDCard...

Lo único que encuentro así a paso veloz es este helper que podría ayudarte http://cc.embarcadero.com/Item/30158, aunque si funciona para ti la ruta tal y como la has colocado, pues genial.

La cosa es que no estoy seguro de que eso te funcione en todos los teléfonos.

jhonny 02-11-2016 19:13:50

No he probado lo siguiente en el teléfono, por lo que me pregunto...¿Qué ruta te arroja si usas lo siguiente?

Código Delphi [-]
ShowMessage(GetEnvironmentVariable('EXTERNAL_STORAGE'))

P.D. Ya sé que no deberíamos usar ShowMessage en Android, pero es para este testeo solamente

jhonalone 03-11-2016 17:10:25

Hola jhonny.
He probaddo lo que me dijiste, pero la carpeta que me devuelve, aunque se puede grabar en ella, es el directorio principal del teléfono. No de la SD.

Por otro lado, (¡¡mi gozo en un pozo!!) tengo que comunicaros que el tema NO ESTÁ SOLUCIONADO del todo, como yo pensaba.

Me explico, la dirección
Código Delphi [-]
DataFile := TPath.Combine('/storage/extSdCard/Android/data/com.(tu Packeage).(Nombre del proyecto)/files/',  'NombreDelFichero.Extensión');

funciona perfectamente con la versión 4.4.2 de Android.

Sin embargo al probarla en una versión más antigua 4.1.2 no funciona.

Ahora bien, utilizando esta dirección
Código Delphi [-]
DataFile := TPath.Combine('/storage/extSdCard/', 'NombreDelFichero.Extensión');

SI FUNCIONA, pero lo graba en el directorio principal de la SD Card, lo que me lleva a concluir que es necesaria alguna función que discrimine entre versiones para poder usarla con cualquier versión. Intentaré conseguirla. Espero que alguien me ayude.

Saludos para todos.

jhonny 03-11-2016 19:53:08

Cita:

Empezado por jhonalone (Mensaje 510418)

Por otro lado, (¡¡mi gozo en un pozo!!) tengo que comunicaros que el tema NO ESTÁ SOLUCIONADO del todo, como yo pensaba.

Me explico, la dirección
Código Delphi [-]
DataFile := TPath.Combine('/storage/extSdCard/Android/data/com.(tu Packeage).(Nombre del proyecto)/files/',  'NombreDelFichero.Extensión');

funciona perfectamente con la versión 4.4.2 de Android.

Sin embargo al probarla en una versión más antigua 4.1.2 no funciona.

Ahora bien, utilizando esta dirección
Código Delphi [-]
DataFile := TPath.Combine('/storage/extSdCard/', 'NombreDelFichero.Extensión');

SI FUNCIONA, pero lo graba en el directorio principal de la SD Card, lo que me lleva a concluir que es necesaria alguna función que discrimine entre versiones para poder usarla con cualquier versión. Intentaré conseguirla. Espero que alguien me ayude.

Saludos para todos.

Es por eso te he recomendado probar el Helper que está en http://cc.embarcadero.com/Item/30158

jhonalone 04-11-2016 11:08:59

Vaya, jhonny.
Parece que pinta bien.
No entré en el enlace cuando me lo dejaste la primera vez, y ahora creo que he perdido el tiempo por no hacerlo.
Lo probaré y te cuento.
Un saludo y gracias.

jhonalone 04-11-2016 13:58:57

Bueno. Ya estoy aquí.

Te cuento.
He bajado y descomprimido el archivo al que apunta el link de Embarcadero.
Sólo venían 3 archivos: Androidapi.IOUtilsEx.pas (que es la unidad principal), Androidapi.JNI.EnvIntf.pas y Androidapi.JNI.SystemIntf.pas (usados por la unidad principal).

Además, en su cláusula uses vienen otros cuantos:
Código Delphi [-]

implementation

uses
  System.SysUtils,
  Androidapi.Jni,
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.JNI.SystemIntf,
  Androidapi.JNI.EnvIntf;

Puesto que para compilarse los necesita todos, he copiado los que faltaban desde el directorio C:\RadStudio10\17.0\source\rtl\android

He creado un proyecto nuevo
Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, Androidapi.IOUtilsEx;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
if isExternalStorageWritable
then Label1.Text := GetExternalSDCardDirectory
else ShowMessage('No hay SD card');
end;

end.

Al pulsar el Button1 me da el bonito mensaje de "Access violation" en dos dispositivos que lo he probado, en los mismos que con las rutas que anteriormente os he comentado, funcionaban.

No sé si es que la unidad está escrita para otra versión de Delphi o qué pasa.

Te agradezco tu esfuerzo, jhonny, pero creo que no voy a perder más tiempo con este asunto.

Gracias de verdad.

Saludos a todos.

jhonny 04-11-2016 18:32:39

Hola, vale, es una pena que no continúes, lo que se me ha ocurrido es que quizá lo que te faltaba solamente era solicitar el permiso, esto no debe ser algo tan complejo.

jhonalone 04-11-2016 19:23:22

jhonny... déjalo, no pierdas más tiempo.
De verdad que te agradezco tu esfuerzo.
Ya que, para el terminal que lo voy a instalar me funciona, creo que no merece la pena emplear más esfuerzo, cuando haya que instalarlo en otro terminal, quizás retome el tema.
Los permisos Read y Write del External Storage del proyecto de prueba están concedidos antes de que me de el error.
Un saludo afectuoso.


La franja horaria es GMT +2. Ahora son las 15:41:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi