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
stalkingwolf

Registriert seit: 6. Mai 2011
521 Beiträge
 
#1

FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 22. Jul 2020, 15:32
Ich versuche gerade ein ÖffnenDialog für Bilder in meine APP einzubauen.
Dabei bin ich auf 2 Probleme gestoßen.

1.
Wenn ich das ActivityResult zurück bekomme und mir den JCursor mit SharedActivity.getContentResolver.query holen möchte, dann stürzt das APP ab, wenn ich im Bilderdialog mehr als ein Bild ausgewählt habe.

Den Bilderdialog starte ich mit folgendem Quellcode
Code:
            FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage (TMessageResultNotification, HandleActivityMessage);

            RequestCode := 0;
            Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK);
            intent.setType(StringToJString('image/*'));
            intent.setAction(TjIntent.JavaClass.ACTION_GET_CONTENT);
            Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE,true);

            ResolveInfo := SharedActivity.getPackageManager.resolveActivity(Intent, 0);
            if ResolveInfo <> nil then SharedActivity.startActivityForResult(Intent, RequestCode);
Funktioniert auch soweit, wenn ich nur 1 Datei auswähle. Aber es war ganz praktikabel wenn der Anwender mehr als eine Datei auswählen könnte.

Code:
var
C      : JCursor;
cols   : TJavaObjectArray<JString>;
begin

  if Assigned(Data) then begin

    cols:= TJavaObjectArray<JString>.Create(1);
    cols[0] := StringToJString('_display_name');
    c:= SharedActivity.getContentResolver.query(
        data.getData,
        cols,
        nil,   //StringtoJString(''),
        nil,
        nil    //StringtoJString('')
);
Da ist noch mehr Quellcode, aber der ist irrelevant.

2.
Wenn ich mir mit Data.getData.getPath den Pfad ausgeben lasse steht dort /document/image:1456
Den Pfad gibt es nicht. Wie bekomme ich hier den korrekten Pfad?

Ich glaube ich hab hier einen falschen Denkansatz oder? Ich bekomme gar nicht den Pfad raus? Sicherheit?
Weil die Document ID ist image:1456. D.h das System verhindert das ich ermitteln kann wo die Datei liegt?

Geändert von stalkingwolf (22. Jul 2020 um 15:44 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

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

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 26. Jan 2021, 09:13
Hallo,

das was da zurückkommt, soweit ich mich momentan schon eingelesennhabe, ist kein richtiger
klassischer Dateipfad sondern eine FILE URI oder so.
Schau dir doch mal die Doku zu dem Intent mal an:

https://developer.android.com/refere...ON_GET_CONTENT

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, 12:42
Da bin ich auch gerade dran.
Er gibt Dir eine URI und damit soll man den richtigen Dateipfad ermitteln können.
Wenn Du nil statt des JArray cols verwendest fragst Du alle spalten ab die da sind.
Um zu sehen welche das sind habe ich das einfach so gemacht und alles in ein Memo schreiben lassen:

Delphi-Quellcode:
for I := 0 to Cursor.getColumnCount - 1 do
begin
  Memo1.Lines.Add(JStringToString(Cursor.getColumnName(I)) +': ' + JStringToString(Cursor.getString(I)));
end;
Anders als man häufig liest findet sich da aber nirgendwo der korrekte Pfad drin.
Es soll eine Spalte namens _data existieren wo der richtige Pfad drin steht aber die wird bei mir auch nicht mit ausgegeben, sprich existiert an der Stelle nicht.

In Java soll der Name hier stehen MediaStore.Images.Media.DATA was in FMX glaube ich TJImages_ImageColumns.JavaClass.DATA entspricht aber da kommt auhc nichts.

Bist Du da eventuell weiter gekommen als ich?

LG

Mirko
  Mit Zitat antworten Zitat
TurboMagic

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

AW: FMX : getContentResolver.query Crash und Jnet_Uri getPath

  Alt 30. Jan 2021, 12:53
Hallo,

diese _Data Spalte gab's bei mir auch nicht, aber ich hab' den woanders gefunden:

Delphi-Quellcode:
function TFileBrowser.HandleIntentAction(const Data: JIntent): boolean;
begin
  log.d('Pfad: ' + JStringToString(Data.getData.getPath));
end;
Nur: ab Android 10 hilft dir der Pfad möglicherweise nicht. Wenn der nämlich auf
einen Ordner wie TPath.GetPublicDownloadsPath zeigt hat man da so ohne weiteres
keine Zugriffsberechtigung mehr.

Was aber seltsamerweise geht ist das hier:

Delphi-Quellcode:
  InputStream := MainActivity.getContentResolver.openInputStream(Data.getData);
  log.d('Zeichen 1: ' + InputStream.read.ToString);
  InputStream.close;
Damit erzeugt man einen input stream aus dem Intent und der Schnippsel oben
liest das erste Zeichen dieses Streams und schreibt es ins Log.

Ich fände es halt toll wenn's doch eine Android 10/11 kompatible Methode gäbe
alle Dateien mit einer gewissen Endung die im TPath.GetSharedDownloadsPath
liegen und man auf die Lese/Schreibzugriff hätte. AQchließlich ist das ja ein
öffentlicher Ordner...
  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, 13:30
Hallo,
Data.getData.getPath gibt aber auf meinem Samsung nicht den Pfad aus, den ich z.B. für den Upload auf einen FTP Server brauchen könnte.
Ich habe da sowas wie /document/image:6775 .

Der InputStream ist aber interessant weil der IndyFTP Client auch einen Stream für den Upload verwendet.

Ich habe jetzt folgendes versucht:

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;

Die Galerie wird geöffnet, ich tippe auf das Bild und da hängt sich die App auf.

LG

Mirko

Geändert von oakley (30. Jan 2021 um 13:46 Uhr)
  Mit Zitat antworten Zitat
oakley

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

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
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 03:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz