Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read


Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 01/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
¿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.
Reply With Quote
  #2  
Old 01/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #3  
Old 02/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #4  
Old 02/11/2016
jhonny's Avatar
jhonny jhonny is offline
Jhonny Suárez
 
Join Date: May 2003
Location: Colombia
Posts: 7,070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Hola, ¿Probaste de pronto así?

Código Delphi [-]
DataFile := TPath.Combine(TPath.GetSharedDocumentsPath, 'NombreDelFichero.Extensión');
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Reply With Quote
  #5  
Old 02/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #6  
Old 02/11/2016
jhonny's Avatar
jhonny jhonny is offline
Jhonny Suárez
 
Join Date: May 2003
Location: Colombia
Posts: 7,070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Quote:
Originally Posted by jhonalone View Post
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Reply With Quote
  #7  
Old 02/11/2016
jhonny's Avatar
jhonny jhonny is offline
Jhonny Suárez
 
Join Date: May 2003
Location: Colombia
Posts: 7,070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
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
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Reply With Quote
  #8  
Old 03/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #9  
Old 03/11/2016
jhonny's Avatar
jhonny jhonny is offline
Jhonny Suárez
 
Join Date: May 2003
Location: Colombia
Posts: 7,070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Quote:
Originally Posted by jhonalone View Post

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
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Reply With Quote
  #10  
Old 04/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #11  
Old 04/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
  #12  
Old 04/11/2016
jhonny's Avatar
jhonny jhonny is offline
Jhonny Suárez
 
Join Date: May 2003
Location: Colombia
Posts: 7,070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Reply With Quote
  #13  
Old 04/11/2016
jhonalone jhonalone is offline
Miembro
 
Join Date: Sep 2007
Location: Madrid
Posts: 571
Poder: 19
jhonalone Va por buen camino
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.
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Grabar y leer datos desde un fichero Jere_84 Varios 13 08/04/2015 14:26
Componente para leer Smart Card shoulder Varios 4 17/01/2014 20:51
Es posible grabar ficheros en un DB José Luis Garcí Varios 2 31/03/2008 20:36
leer palabras de ficheros de texto alba13 OOP 10 21/10/2007 16:15
Leer ficheros Mac en Delphi thagson Varios 6 23/08/2006 14:12


All times are GMT +2. The time now is 23:07.


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