Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10.4 (https://www.delphipraxis.net/205436-android-zugriff-auf-externe-dateien-nicht-shareable-media-files-seit-delphi-10-4-a.html)

philipp.hofmann 11. Sep 2020 11:52

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ich unterscheide auch immer zwischen zwei Dingen:
1. Will ich wirklich, dass der User über Geräte hinweg mit Daten arbeiten kann; da nutze ich aktuell die myCloudData-Datenbank von TMSSoftware
2. Will ich nur, dass der User auf einem Gerät die Daten aus meiner App z.B. im Browser benutzen kann und dafür nutze ich den Download-Ordner
a) bei iOS gibt es keinen solchen Ordner, sondern man muss direkt in die iCloud Drive, was schon mal deutlich aufwändiger ist
b) bei Android wird dies ab Android 11 jetzt auch schwieriger, aber sicherlich nicht unmöglich (hoffe ich mal)

himitsu 11. Sep 2020 12:19

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
3. Will ich dass mein Programm auch Offline funktioniert, ohne dass man zwingend Netz/WLAN hat.

Bei Android war es früher schon nicht einfach, einen schönen Platz zu finden, wo Dateien auch von anderen Programmen gelesen und vielleicht sogar geändert werden können.
Wenn keine SD-Karte vorhanden war, wurde es schon schwerer.


Ich weiß auch nicht, warum es sooooo schlimm ist, auf den Geräten einen Speicherplatz zur Verfügung zu stellen, auf den alle Programme Zugriff haben,
notfalls mit einer Whitelist, wo man anderen (definierbaren) Apps Lese- und vielleicht sogar Schreibrechte gewährt.
(so als Frage an die OS-Hersteller und deren kranke Vorstellungen)

PiBi7 12. Apr 2021 13:56

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Tach zusammenthema
Sorry, wenn ich dieses Thema nochmals aufwärme, aber ich bin erst seit kurzem mit diesem Thema konfrontiert. Unsere App speicherte bis Anhin die Dateien im Ordner SharedDocuments ab. Das klappt mit Android 11 nun nicht mehr. Das ist zwar schade, dass nun diese Dateien per USB gesichert/editiert werden können, aber damit habe ich vermutlich in Zukunft zu leben.

Ein User hat vorher im Thread gefragt, wie das nun in Delphi anzuwenden sei, aber keine Antwort erhalten. Da ich momentan auch noch keinen Plan habe wie das mit "Scoped Storage" funktioniert, würde mich das auch sehr stark interessieren. Zudem konnten wir bis anhin die IMEI des Geräts auslesen, dies scheint nun auch unterbunden zu werden. Dürfte wohl die gleiche Sicherheitsproblematik betreffen und ähnlich zu lösen zu sein.

Als weiteres muss unsere App auf Mediendateien, Kamera und Mikrofon zugreifen können. Für die Sounddateien existiert zwar ein Beispiel, aber ich blicke da noch nicht so ganz durch.

Herzlichen Dank für eure Unterstützung
Patrik

TurboMagic 12. Apr 2021 21:34

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Es gibt die Möglichkeit einen System Datei Speichern Dialog aufzurufen,
benötigt Android APIs Nutzung. Der liefert einen Contest Provider
oder so zurück und der kann mittels Android APIs Stream mäßig benutzt
werden und da könntest du deinen Dateiinhalt reinschreiben.

himitsu 13. Apr 2021 10:33

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ansonsten geht ja die eine funktionierende Lieblingslösung der Hersteller über ihre Cloud. :stupid:

philipp.hofmann 6. Mai 2021 16:26

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ich habe über die beiden Varianten jetzt mal ein paar Minuten drüber geschaut und weiß noch nicht genau, wie sich dies mit Delphi umsetzen lässt:

1. Update your app to use more privacy friendly best practices, such as the Storage Access Framework or Media Store API
2. Update your app to declare the All files access (MANAGE_EXTERNAL_STORAGE) permission in the manifest file, and complete the All files access permission declaration in Play Console from May 5th

Wenn hier jemand ein Code-Beispiel hat, gerne her damit. Im Grundsatz geht es mir v.a. darum Dateien im SharedDownloads-Verzeichnis von Android abzulegen, da man dann im Browser darauf zugreifen soll.

3. Als Alternative wurde ja schon das Google-Drive angesprochen. Kann man das Google-Drive des angemeldeten Benutzers über einen Pfad einfach ansprechen (so wie es unter iOS funktioniert)?

Delphi-Quellcode:
    nsFile := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager);

    URL:=nsFile.URLForUbiquityContainerIdentifier(nil);
    if (URL <> nil) then
    begin
      URL:=URL.URLByAppendingPathComponent(StrToNSStr('Documents'));
      Result := UTF8ToString(URL.path.UTF8String);
      if (not nsFile.fileExistsAtPath(URL.path,nil)) then
      begin
        mlog.info('create new iCloud directory: '+result);
        if (nsFile.createDirectoryAtURL(URL,true,nil,nil)) then
          mlog.info('Created new iCloud directory '+result)
        else
          mlog.info('Can´t creat new iCloud directory '+result);
      end;
    end else
      Result := '';

TurboMagic 6. Mai 2021 16:41

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Hallo,

Idee Nr. 2 nicht umsetzen, da wirst du vermutlich an Google scheitern, es sei denn deine
App ist ein Dateimanager.

Wenn du Dateien in den öffentlichen Downloads Ordner bekommen willst dürfte m.W. bei
Scoped Storage kein Weg um den ACTION_CREATE_DOCUMENT oder ACTION_OPEN_DOCUMENT Intent führen.
Grundsätzliche Beispiele dafür gibt's glaube ich in der EN Delphipraxis.

Mehr Lesestoff dazu gibt's hier:
https://developer.android.com/traini...ocuments-files

Grüße
TurboMagic

philipp.hofmann 7. Mai 2021 16:19

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Danke, funktioniert soweit. Hier der Vollständigkeithalber noch der Code, wie ich jetzt Dateien in den SharedDownload-Folder bekomme (den Read-Code habe ich in einem anderen Issue schon gepostet):

Aufruf der Dateiauswahl-Funktion:
Delphi-Quellcode:
    var Intent: JIntent;

    fileToWrite:=appPathRef+'docs'+System.IOUtils.TPath.DirectorySeparatorChar+'icTrainer.txt';
    TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessageTCXWrite);
    Intent:=TJIntent.create;
    Intent.setAction(TJIntent.JavaClass.ACTION_CREATE_DOCUMENT);
    Intent.setType(StringToJString('*/*'));
    Intent.putExtra(TJIntent.JavaClass.EXTRA_TITLE,StringToJString(TFileUtils.removePath(fileToWrite)));
    Intent.addCategory(TJIntent.JavaClass.CATEGORY_OPENABLE);
    MainActivity.startActivityForResult(Intent,0);
Schreiben der Datei (hier Kopie einer vorhandenen Datei):
Delphi-Quellcode:
procedure TicTrainerF.HandleActivityMessageTCXWrite(const Sender: TObject; const M: TMessage);
var Data:JIntent;
    uri:String;
    jos: JOutputStream;

    Arr: TBytes;
    len:Integer;
    b: TJavaArray<Byte>;
begin
  if (M is TMessageResultNotification) then
  begin
    TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, HandleActivityMessageTCXWrite);
    data:=TMessageReceivedNotification(M).Value;
    uri:=JStringToString(Data.getData.toString);
    Arr := TEncoding.UTF8.GetBytes(TStringUtils.listToString(TFileUtils.readFileUTF8(fileToWrite),TStringUtils.getLineFeed()));
    len := Length(Arr);
    b:=TJavaArray<Byte>.Create(len);
    if (len>0) then
      Move(Arr[0],b.Data^,len);
    jos:=TAndroidHelper.Context.getContentResolver.openOutputStream(Data.getData);
    jos.write(b);
    jos.close;
  end;
end;

himitsu 7. Mai 2021 16:26

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Delphi-Quellcode:
... + TPath.DirectorySeparatorChar + ...


Delphi-Quellcode:
TPath.Combine(..., ...)
:zwinker:
Und auch falls bereits ein abschließender Separator im ersten String ist, dann wird das abgefangen (nicht doppelt drin).
Ebenso, wenn der zweite String ein absoluter Pfad ist (kein Relativer), dann wird der Erste natürlich weggelassen.

mstratmann 14. Sep 2023 19:10

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Hallo,

wo finde ich denn die Klasse TFileUtils und TStringUtils in Delphi 11.3?

Gruß
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
Seite 2 von 3     12 3      

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