Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #2  
Antiguo 01-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #3  
Antiguo 02-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #4  
Antiguo 02-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
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/
Responder Con Cita
  #5  
Antiguo 02-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #6  
Antiguo 02-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por jhonalone Ver Mensaje
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/
Responder Con Cita
  #7  
Antiguo 02-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
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/
Responder Con Cita
  #8  
Antiguo 03-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #9  
Antiguo 03-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por jhonalone Ver Mensaje

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/
Responder Con Cita
  #10  
Antiguo 04-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #11  
Antiguo 04-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
  #12  
Antiguo 04-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
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/
Responder Con Cita
  #13  
Antiguo 04-11-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Poder: 17
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Grabar y leer datos desde un fichero Jere_84 Varios 13 08-04-2015 15:26:49
Componente para leer Smart Card shoulder Varios 4 17-01-2014 21:51:03
Es posible grabar ficheros en un DB José Luis Garcí Varios 2 31-03-2008 21:36:49
leer palabras de ficheros de texto alba13 OOP 10 21-10-2007 17:15:15
Leer ficheros Mac en Delphi thagson Varios 6 23-08-2006 15:12:08


La franja horaria es GMT +2. Ahora son las 12:23:46.


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
Copyright 1996-2007 Club Delphi