Einzelnen Beitrag anzeigen

OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Datei auf Android wird nicht gespeichert

  Alt 13. Feb 2015, 00:40
Hallo Freunde,

habe mit der 30-Tage-Demo von XE7 mal in die Android-ENtwicklung hineingestöbert. Und bin dabei auf ein Rätsel gestoßen. Denn mein Testprogramm ist nicht in der Lage, eine Textdatei auf dem Android-Gerät zu speichern. Die Datei ist schlicht nicht da, nicht bei Programmstart, nicht während der Laufzeit, nicht nach Programmende.

Folgender Code wird dazu benutzt:
Delphi-Quellcode:
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,
  System.Sensors, System.Sensors.Components, System.IOUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    LocationSensor1: TLocationSensor;
    Label1: TLabel;
    Label2: TLabel;
    LongLabel: TLabel;
    LatLabel: TLabel;
    Label3: TLabel;
    RefreshLabel: TLabel;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure LocationSensor1LocationChanged(Sender: TObject; const OldLocation,
      NewLocation: TLocationCoord2D);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    f: TEXTFILE;
    fs: TFileStream;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  if Button1.Tag=0 then
  begin
    Button1.Text:='Started';
    Button1.Tag:=1;
    s:=System.IOUtils.TPath.Combine(System.IOUtils.tpath.getdocumentspath,'test.txt');
    ShowMessage(s);
    AssignFile(f,s);
    ReWrite(f);
    Writeln(f,'Lat;Lng');
    Flush(f);
    //fs:=TFileStream.Create(s,fmCreate);
    //fs.WriteData(string('Test').ToCharArray);
    //s:='Lat;Lng'#13#10;
    //fs.Write(PChar(s)^, Length(s));
  end
  else
  begin
    Button1.Text:='Stopped';
    Button1.Tag:=0;
    CloseFile(f);
  end;
  LocationSensor1.Active:=(Button1.Tag=1);
end;

procedure TForm1.LocationSensor1LocationChanged(Sender: TObject; const OldLocation, NewLocation: TLocationCoord2D);
var
  s,s1: string;
begin
  try
    RefreshLabel.Text:=DateTimeToStr(now);
    s:=Format('%2.7f',[NewLocation.Latitude]);
    s1:=s;
    s1:=s1+';';
    LatLabel.Text:=s;
    //fs.Write(PChar(s)^, Length(s));
    //s:=';';
    //fs.Write(PChar(s)^, Length(s));
    s:=Format('%2.7f'#13#10,[NewLocation.Longitude]);
    LongLabel.Text:=s;
    s1:=s1+s+#13#10;
    writeln(f,s1);
    Flush(f);
    //fs.Write(PChar(s)^, Length(s));
  except
    RefreshLabel.Text:='(invalid Position received)';
  end;
  Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  RefreshLabel.Text:='';
  Timer1.Enabled:=false;
end;

end.
Ein Klick auf den Button startet den GPS-Sensor, erzeugt eine Textdatei und schreibt da eine Zeile schon mal rein. Bei jeder Änderung der GPS-Werte werden die Koordinaten in die Textdatei geschrieben. Erneuter Klick auf den Button stoppt das ganze und schließt die Datei ordentlich.

Die Showmessage beim Start zeigt mir den kompletten Namen der Datei an ("data/data/com.embarcadero.project1/test.txt") und das Programm läuft ohne Murren. Nur eine Test.txt ist nirgendwo zu finden. Auf dem ganzen Handy nicht.

Ich habe das mit meinem S5 ausprobiert und einem Galaxy Tab 7.0 - beide zeigen das gleiche Phänomen. Spaßenshalber habe ich auch mal anstelle des TEXTFILE das ganze mit FileStreams versucht. Same result.

Ich habe den Verdacht, das das an der Test-Version von XE7 liegt, kann mir das aber nicht so recht vorstellen. Wo liegt dann der Fehler ?
  Mit Zitat antworten Zitat