Delphi-PRAXiS

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 9. Sep 2020 15:19

Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10.4
 
Hi,

ich habe in der Vergangenheit schon den Zugriff auf externe Dateien unter Android implementiert und damit unter anderem auf Daten der SD-Karte zugegriffen (/storage/0000-0000/[myDir]). Dies hat auch alles mal funktioniert. Seit Delphi 10.4 habe ich aber nur noch Access auf die Shareable Media Files und nicht mehr auf beliebige externe Dateien.

Ich habe folgende Dinge gesetzt/abgefragt:
- Entitlement List: Secure File Sharing aktiviert
- PermissionsService.RequestPermissions(['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'], ReadExternalStorageRequestResult);

Mit Delphi 10.3.3 gegen Android 32 auf einem aktuellen Amazon FireHD10-Tablet (müsste Android 9.0 entsprechen) funktioniert es noch.
Mit Delphi 10.3.3 gegen Android 64 auf einem aktuellen Samsung S4-Tablen (Android 10.0) funktioniert es noch.

Mit Delphi 10.4.x gegen Android 64 auf dem Samsung S4-Tablet, reicht dies nicht mehr aus und ich habe keine Zugriff mehr auf die externen Dateien.
Weiß jemand schon, was hier zusätzlich zu tun ist?

Grüße, Philipp

TurboMagic 9. Sep 2020 18:29

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

das hat glaube ich mit Berechtigungsänderungen in neueren Android Versionen (Android 10 glaube ich) zu tun.
Es gibt zumindest vorübergangsweise noch eine Kompatibilitätseinstellung, mit derm man das alte Verhalten
erreichen kann. DIe ist im Manifest anzugeben.
Details weiß ich aber gerade auch nicht.

Evtl. hilft das hier:
https://developer.android.com/about/...s-private-dirs

Grüße
TurboMagic

Rollo62 9. Sep 2020 18:40

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Hast Du mal das XML Template neu erzeugen lassen ?
Wenn Du von Rx10.3.3 kommst wird da ein Eintrag neu reingesetzt.
Das war wohl das opt-out was TurboMagic meint.

philipp.hofmann 9. Sep 2020 18:48

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ja, danke. Dies hilft temporär, wenn man die letzte Property im Template hinzufügt:
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated% "
android:resizeableActivity="false"
android:requestLegacyExternalStorage="true">

Temporär, weil dies mit Android 11 nicht mehr funktioniert, da werde ich mich nochmals mit dem "Scoped Storage"-Konzept auseinandersetzen müssen.
Bei Delphi 10.3.3 war diese Property noch nicht notwendig, erst ab Delphi 10.4.

Rollo62 9. Sep 2020 19:17

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ja, musst Du denn extern aussrhalb des App specific Folder speichern ?
Ich denke das wird zunehmend schwieriger.

Auch werden die Files wohl nach Deinstallation gelöscht, und sind für immer weg.

Ich versuche mich mit dem MediaStore anzufreunden, der kann wohl auch beliebige Files.
Richtig rund ist das Ganze aber noch nicht, ich habe z.B. Sqlite Files, wo sollte ich die Speichern ?

TurboMagic 9. Sep 2020 19:29

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Ich werde das Problem evtl. auch bekommen. Bisher speichere in nach SharedDownloads.
Wie soll denn z.B. ein Webbrowser in Zukunft Downloads abspeichern? Die will man ja
schließlich von außerhalb nutzen können!

Und ich speichere extra nach dort, da Benutzer solche Dateien frei kopieren können sollen
u.a. auch auf das Gerät! Da hilft mein eingebautes ShareSheet nicht, da man dadurch ja nur
Dateien vom Gerät weg bekommt ;-)

So ein Mist immer alles nur noch mehr zu vernageln!
Gewisse DInge müssen aus Sicherheitsgründen sein, aber sowas?

Wie nutzt man denn dieses "Scoped Storage"-Konzept?

Grüße
TurboMagic

philipp.hofmann 9. Sep 2020 19:34

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Mir ging es heute im ersten Schritt auch genau um SharedDownloads.
Ich habe mir das Thema noch nicht genauer angeschaut, dein Link enthält da aber ein paar Infos.
Android 11 ist ja auch erst seit heute da.

Rollo62 10. Sep 2020 14:26

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

Zitat von TurboMagic (Beitrag 1473332)
So ein Mist immer alles nur noch mehr zu vernageln!
Gewisse DInge müssen aus Sicherheitsgründen sein, aber sowas?

Ich bin schon seit geraumer Zeit auf der Suche nach Mobile-Cloud Lösungen,
ich nenne es besser Mobile-Server.

Damit man von dem Phone runterkommt, und wieder seine Daten nutzen kann.

Das verkaufen uns Einige Cloud-Anbieter, aber wenn man scharf nachrechnet ist es immer die reine Abzocke.
Dafür suche ich eben erstmal eine LowCost-Option, z.B. auf virtuellen PHP-servern, und da ist schon Vieles möglich.
Skalieren kann man später ja immmer noch, falls das überhaupt in Frage kommt.

Und ja, bei 1 Mio. Usern ist das NICHT der richtige Weg, aber bei 3-10K Usern,
die jetzt nicht Alle ständig den Server gleichzeitig belegen mag das noch gehen.

Das wäre ein Lösungsansatz um die immer stärkere Restiktion aufzubrechen.

Was auch möglich wäre z.B. die plattform-eigenen Server iCloud, GoogleCloud zu nutzen um Daten zu speichern.
Aber auch das geht immer durch das API Nadelöhr, und nervt genauso.

TurboMagic 10. Sep 2020 15:11

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Was bitte spricht dagegen, den Benutzer seine Daten in "Downloads" ablegen zu lassen und mittels
USB Kabel/Bluetooth/W-Lan und Dateimanager diese zu transferieren?
Doch nur, dass der Plattformanbieter kein Zusatzgeschäft machen kann.
Und den ordner Dokumente gibt's ja auch noc. Wozu soll der gut sein, wenn man nix mer drin
ablegen kann/darf? ;-)

Rollo62 10. Sep 2020 15:16

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Wenns um Transfer geht dann gäbe es noch Tethering ...

Es kommt halt immer auf die Anwendung an was man gerade braucht.

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

himitsu 14. Sep 2023 19:41

AW: Android: Zugriff auf externe Dateien (nicht Shareable media files) seit Delphi 10
 
Das sind Units

Ups, ist wohl was Eigenes?

Aber klingt so, als würde es deren Funktionen dennoch geben (unter anderen Namen)

Delphi-Referenz durchsuchenIOUtils Delphi-Referenz durchsuchenTFile
Delphi-Referenz durchsuchenStrUtils
und im String-Helper

mstratmann 14. Sep 2023 20:47

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

Zitat von himitsu (Beitrag 1526963)
Das sind Units

Ups, ist wohl was Eigenes?

Aber klingt so, als würde es deren Funktionen dennoch geben (unter anderen Namen)

Delphi-Referenz durchsuchenIOUtils Delphi-Referenz durchsuchenTFile
Delphi-Referenz durchsuchenStrUtils
und im String-Helper

Hallo,

Danke. Scheint was eigenes zu sein, ich hab es inzwischen mit TFileStream lösen können.

Gruß
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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