AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi FMX : getContentResolver.query Crash und Jnet_Uri getPath
Thema durchsuchen
Ansicht
Themen-Optionen

FMX : getContentResolver.query Crash und Jnet_Uri getPath

Ein Thema von stalkingwolf · begonnen am 22. Jul 2020 · letzter Beitrag vom 1. Mär 2021
Antwort Antwort
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#1

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 14:27
Delphi-Quellcode:
var
ms : TMemoryStream;
InputStream : JInputStream;
b: TJavaArray<Byte>;

InputStream := MainActivity.getContentResolver.openInputStream(Da ta.getData);
b := TJavaArray<Byte>.Create(InputStream.available);
InputStream.read(b);
ms.Write(b.Data^, b.Length);
InputStream.close;
idftp1.Connect;
idftp1.Put(ms,'test.jpg',false,-1);
idftp1.Disconnect;
InputStream.read(b); geht noch
ms.Write(b.Data^, b.Length); geht nicht mehr, hier hängt die App sich auf

LG

Mirko
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 14:37
1. Das was da zurück kommt ist tatsächlich kein richtiger Dateiname sondern eine URI.
Das ist ja auch Absicht von denen, denn die wollen für viele Pfade ja nicht mehr,
dass du direkt Datei mäßig darauf zugreifst.

2. Warum es bei dir crash weiß ich nicht wirklich, aber was ist denn der Rückgabewert
von Read? Ich sehe auch nirgens, wo du deinen ms erzeugst...

Grüße

TurboMagic
  Mit Zitat antworten Zitat
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#3

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 15:03
Ja stimmt ich habe ms := TMemoryStream.Create; hinzugefügt und er stürzt nicht mehr ab.

Jetzt muss ich es nur noch ein wenig verbessern mit Fortschrittsbalken und mehreren Dateien und dann passt das.

Die Funktion sieht damit bis jetzt so aus:

function TMFORM.HandleIntentAction(const Data: JIntent): Boolean;
var
C: JCursor;
I: Integer;
ms : TMemoryStream;
InputStream : JInputStream;
b: TJavaArray<Byte>;
begin
Memo1.Lines.Add('URI:' + JStringToString(Data.getData.toString)); // this returns the URI in string perfectly... so I know that I am getting the file path properly
InputStream := MainActivity.getContentResolver.openInputStream(Da ta.getData);
b := TJavaArray<Byte>.Create(InputStream.available);
ms := TMemoryStream.Create;
InputStream.read(b);
Memo1.Lines.Add('Stream länge:' + inttoStr(b.Length));
ms.Write(b.Data^, b.Length);
InputStream.close;
idftp1.Connect;
ms.Position := 0;
idftp1.Put(ms,'test.jpg');
idftp1.Disconnect;
end;

Geändert von oakley (30. Jan 2021 um 15:10 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 15:17
Hinweis für dich:

bevor du das nächste Mal Quellcode postest eifnach mal den "Delphi-Helm" oberhalb
des Editors anklicken und den QUellcode dann dazwischen einfügen.
Dann wird er sauber formatiert angezeigt!
  Mit Zitat antworten Zitat
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#5

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 15:46
Hey,

ja ich weiß aber ich habe den Betrag editiert und da hatte ich die Option nicht auf den Helm zu klicken.

So habe ich es jetzt für mehrere Dateien ohne Fortschrittsbalken gelöst.
Hier ist noch das Problem, dass der Bildschirm schwarz wird bis der Upload abgeschlossen ist.

Delphi-Quellcode:
function TMFORM.HandleIntentAction(const Data: JIntent): Boolean;
var
  C: JCursor;
  I, count: Integer;
  ms : TMemoryStream;
  InputStream : JInputStream;
  b: TJavaArray<Byte>;
begin
  count := Data.getClipData().getItemCount();
  for i := 0 to count-1 do
  begin
    Memo1.Lines.Add('URI:' + JStringToString(Data.getClipData().getItemAt(i).getUri.toString));
    InputStream := MainActivity.getContentResolver.openInputStream(Data.getClipData().getItemAt(i).getUri);
    b := TJavaArray<Byte>.Create(InputStream.available);
    ms := TMemoryStream.Create;
    InputStream.read(b);
    Memo1.Lines.Add('Stream länge:'  + inttoStr(b.Length));
    ms.Write(b.Data^, b.Length);
    InputStream.close;
    if not idftp1.Connected then
      idftp1.Connect;
    ms.Position := 0;
    idftp1.Put(ms,'test'+InttoStr(i)+'.jpg');
    ms.Free;
    b.Free;
  end;

  idftp1.Disconnect;
end;
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 16:00
Tja, der Bildschirm wird vermutlich schwarz, weil das vermutlich eine blockierende Operation ist.
Indy arbeitet glaube ich mehrheitlich blockierend.

Kann das evtl. in einen Thread/Task gepackt werden?
  Mit Zitat antworten Zitat
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#7

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 16:34
Ja hab es in einen Task gepackt und er blockiert nicht mehr.

Muss noch Upload Progress machen usw.
Wenn ich fertig bin poste ich den Code.

LG

Mirko
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
549 Beiträge
 
#8

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 1. Mär 2021, 15:16
Hey danke für eure weitere Diskussion.
Ich habe das Thema damals zur Seite gelegt weil ich nicht weiterkam.
Ich habe das ganze nun auch gelöst für EINE Datei

Code:
InputStream := SharedActivity.getContentResolver.openInputStream(Data.getData);
b          := TJavaArray<Byte>.Create(InputStream.available);
ms         := TMemoryStream.Create;

InputStream.read(b);
ms.Write(b.Data^, b.Length);
ms.SaveToFile( filename );

ms.Free;
b.Free;
InputStream.close;
Ich habe allerdings immernoch das Problem mit mehreren Dateien.
Sobald ich auf Data zugreife knallt es.
Code:
function TFmain.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
begin
   if RequestCode = ScanRequestCode then begin
      if ResultCode = TJActivity.JavaClass.RESULT_OK then begin
         if Assigned(Data) then begin
                            addlog(data.getData.getPath);
addlog schreibt mir das in ein Memo und in eine ASCII Datei.
Mit einer Datei kein Problem. Sobald 2 oder mehr Dateien selektiert wurden stürzt das ganze ab.


Wenn ich den Code umschreibe was ihr nutzt also
Data.getClipData().getItemCount();
JStringToString(Data.getClipData().getItemAt(i).ge tUri.toString)
Dann funktioniert es mit 2 Dateien, aber nicht mehr wenn ich eine Datei auswähle.

Ich vermute es ligt am Aufruf der Auswahl.
Wie schaut bei euch der der Quellcode aus?
Meiner ist noch wie auf Seite 1.


EDIT :
Hab das soweit nun alles hinbekommen. Musste eine Kombination aus beidem einbinden und ganz oben abprüfen
Code:
if assigned(data.getClipData) then begin
.
.
else begin
.
.
end;
Was ich nun nur noch habe ist das die Datei nach Tmemorystream.savetofile(); nicht direkt vorhanden ist.
Also ein fileexist danach gibt false aus.
Das dauert eine Zeit bis die Datei vorhanden ist und man diese öffnen kann.

Geändert von stalkingwolf ( 1. Mär 2021 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz