Delphi-PRAXiS
Seite 2 von 2     12

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi FMX : getContentResolver.query Crash und Jnet_Uri getPath (https://www.delphipraxis.net/205002-fmx-getcontentresolver-query-crash-und-jnet_uri-getpath.html)

TurboMagic 30. Jan 2021 17:00

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
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?

oakley 30. Jan 2021 17:34

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
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

oakley 31. Jan 2021 00:09

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
So weit so gut.

Ich habe jetzt folgenden Code für den Upload

Delphi-Quellcode:
function TMFORM.HandleIntentAction(const Data: JIntent): Boolean;
var
  C: JCursor;
  count: Integer;
  InputStream : JInputStream;
  ms : TMemoryStream;
  b: TJavaArray<Byte>;
  wfilter: TJavaObjectArray<JString>;
  filename : String;
begin
  count := Data.getClipData().getItemCount();
  ProgressBar1.Min := 0;
  ProgressBar1.Max := count;
  TTask.Run(
  Procedure
  var i,m : Integer;
  begin
    for i := 0 to count-1 do
    begin
      C := MainActivity.getContentResolver.query(Data.getClipData().getItemAt(i).getUri,nil,StringToJString(''),nil,StringToJString(''));
      C.moveToFirst;
      for m := 0 to C.getColumnCount - 1 do
      begin
         if JStringToString(C.getColumnName(m)) = '_display_name' then
         begin
           filename := JStringToString(C.getString(m));
           break;
         end;
      end;
      InputStream := MainActivity.getContentResolver.openInputStream(Data.getClipData().getItemAt(i).getUri);
      ms.Free;
      b.Free;
      b := TJavaArray<Byte>.Create(InputStream.available);
      ms := TMemoryStream.Create;
      InputStream.read(b);
      ms.Write(b.Data^, b.Length);
      InputStream.close;
      ms.Position := 0;
      if not idftp1.Connected then idftp1.Connect;
      idftp1.Put(ms,filename);
    end;
    idFTP1.Disconnect;
  end);
end;
Der Upload zeigt ab und zu die Meldung "keine Duplikate zulässig" und der Fortschrittsbalken steht direkt nach beginn des Uploads bei 100%.
Hier hätte ich gerne etwas das die geladenen kBytes pro Datei anzeigt. Geht sowas? Und der Fortschrittsbalken ist sehr dünn, kann man den etwas breiter machen?
In Firemonkey kann ich zwar die Höhe mit der Maus ziehen, wird aber direkt wieder zurück gestellt.

Delphi-Quellcode:
procedure TMFORM.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  TTask.Run(
  Procedure
  begin
    //Aktualisieren der Fortschrittsanzeige:
    ProgressBar1.Value:= AWorkCount;
  end);
end;
Ich wollte die Bilder vor dem Upload auch noch verkleinern denn ich brauche die Vollauflösung der Kamera nicht und der Upload geht wesentlich schneller.
Gibt überhaupt eine praktikable Lösung auf dem Handy oder kommt man da schnell an die Leistungsgrenze?

LG

Mirko

TurboMagic 31. Jan 2021 09:21

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
Guten Morgen,

wenn du den Prozentbalken etwas breiter haben willst, musst du dich mit den FMX Stilen
beschäftigen. Du brauchst einen eigenen Stil für den Prozentbalken.

Schau doch mal, ob du nicht mit der rechten Maustaste auf deinen Prozentbalken
klicken kannst und dort eine Option findest um einen eigenen Stil anzulegen.
Den kannst du dann im Stildesigner bearbeiten.

Die meisten Stile sind eine Mischung aus einem Bereich einer Bitmap und aus
graphischen Objekten.

Grüße
TurboMagic

oakley 31. Jan 2021 13:48

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
Hast Du eventuell eine Idee, woher die Meldung "keine Duplikate zulässig" kommt?

LG

Mirko

TurboMagic 31. Jan 2021 22:46

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
Keine Ahnung, verwende normalerweise kein Indy...

TurboMagic 16. Feb 2021 14:10

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
Hallo,

habe mich heute auch wieder mit dem Datei Auswählen Thema beschäftigt.
Leider mit weniger Erfolg als du.
Eine einzelne bekomme ich und kann sie auslesen über Data.getData,
sobald ich aber das EXTRA_ALLOW_MULTIPLE hinzufüge und im HandleIntentAction auf
Data.getClipData().getItemCount() zugreife erhalte ich eine Segmentverletzung (11).
Außerdem löst er dieses HandleIntentAction bereits beim Tippen auf eine Datei aus.
In meinem Fall hab' ich als MIME Type gerade Text/* angegeben.

Ich nutze Delphi 10.4.1 und ein Android 10 Gerät.

Woran kann das liegen?

Grüße
TurboMagic

TurboMagic 16. Feb 2021 15:36

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
Ursache gefunden: liegt am MIME type!
Mit image/* geht sowas, da stürzt ClipData nicht ab und man bekommt die Chance mehrere
Bilder auszuwählen, mit */* geht's nicht. Da geht nur einzelauswahl.

Mist!

stalkingwolf 1. Mär 2021 16:16

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr.
Seite 2 von 2     12

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf