Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen (https://www.delphipraxis.net/213061-kann-delphi-11-3-fmx-android-kein-verzeichnis-anlegen.html)

dynamo 17. Mai 2023 09:53

Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen
 
Meine bisherigen Apps, die ich bis einschl. Delphi 10.4 geschrieben habe, möchte ich nun auf Delphi 11.3 migrieren. Aber da knirscht es leider mächtig im Gebälk.
Es fäng damit an, dass ich die Permissions anpassen musste (ich hoffe, dass ich das so richtig gemacht habe (s.Code). Nun habe ich Probleme damit, Verzeichnisse anzulegen. Bis einschl. Delphi 10.4 FMX habe ich das immer so gemacht und es hat funktioniert. Jetzt geht das leider nicht mehr so. Warum nicht?

Delphi-Quellcode:
// ein Beispielcode mit Permissions und Verzeichnis anlegen in D11.3
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,FMX.DialogService,system.permissions,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
    FRead,
    FWrite:string;
    procedure SetPermissions;
    procedure MakeReadWritePermissionRequestResult(Sender:TObject;const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zugriffErlaubt :boolean = false;
implementation
uses Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os;

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject); // dies ist für mich der wichtigste Teil
var basisdir,dir,Verzeichnis: string;
begin
    basisdir := '/storage/emulated/0/';
    dir := 'testdir';
    Verzeichnis := basisdir+dir;
    showmessage('Zugriff erlaubt= '+BoolToStr(zugriffErlaubt,true)+' auf '+Verzeichnis);
//    if zugriffErlaubt then
//    if not System.SysUtils.directoryexists(basisdir+dir) then
      System.SysUtils.ForceDirectories(Verzeichnis); // funzt leider nicht. bis D10.4 ging's aber so. Auch mit Android 13
end;

procedure TForm1.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
begin
  TDialogService.ShowMessage('Berechtigung erforderlich',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  setpermissions;
end;

procedure TForm1.SetPermissions;
begin
  if CompilerVersion <= 32 then exit;
  FRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
  FWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
  PermissionsService.RequestPermissions([FRead,FWrite],MakeReadWritePermissionRequestResult, DisplayRationale);
end;

procedure TForm1.MakeReadWritePermissionRequestResult(Sender:TObject;const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
  if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted)
  then zugriffErlaubt := True
  else zugriffErlaubt := False;
end;
end.

Klapauzius 17. Mai 2023 10:08

AW: Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen
 
Ab Android 11 (API level 30) ist kein Zugriff mehr auf den externen Storage erlaubt:
https://developer.android.com/about/...rivacy/storage

dynamo 17. Mai 2023 12:50

AW: Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen
 
Zitat:

Zitat von Klapauzius (Beitrag 1522528)
Ab Android 11 (API level 30) ist kein Zugriff mehr auf den externen Storage erlaubt:

das kann so nicht stimmen: ich benutze parallel noch meine apps unter Delphi 10.4 und lade sie auf meine Android-Geräte mit Android 9,11 und 13 hoch. ALLES !! funktioniert wunderbar! Lediglich meine Migration auf Delphi 11.3 macht Schwierigkeiten, obwohl ich dort das selbe SDK benutze wie bereits unter D10.2 und D10.4.
Es ist mir wohl bekannt, dass man GetDocumentsPath benutzen soll. Da hab ich leider ein großes Problem mit: Ich weiß nicht, wo ich auf meinem Gerät meine Daten wiederfinde - vielleicht bin ich tatsächlich zu blöd dazu? Wenn ich mir z.B. mit showmessage(GetDocumentPath) das Verzeichnis anzeigen lasse, hab ich das Gefühl, dass mir irgendein Fantasieverzeichnis angezeigt wird. Mit einem Dateimanager wie z.B. Totalcommander kann ich dieses Verzeichnis jedenfalls nicht finden. Ich hatte in der Vergangenheit auch mal mit GetDocumentPath experimentiert und es hat auch wunderbar funktioniert, aber ich wusste nicht, wo meine gespeicherten Daten auf dem Gerät zu finden sind. Mit sowas kann ich leider nichts anfangen. Deshalb habe ich mir angewöhnt, eigene Verzeichnisse anzulegen.

Klapauzius 17. Mai 2023 13:07

AW: Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen
 
Zitat:

Zitat von dynamo (Beitrag 1522535)

das kann so nicht stimmen

Wenn du Googles Dokumentation nicht glaubst, wem soll man dann noch glauben wenn es um Android geht?

Schau doch mal nach welche Einstellungen du bei Delphi 10.4 unter SDK API und bei Delphi 11.3 hast. Ich denke du kompilierst für eine neuere SDK Version unter Delphi 11.

Edit:
Ähnliche Diskussion in der englischsprachigen DP:
https://en.delphipraxis.net/topic/85...#comment-72102

himitsu 17. Mai 2023 14:55

AW: Kann in Delphi 11.3 FMX-Android kein Verzeichnis anlegen
 
Außerdem niemals hard-codierte Pfade verwenden.

Schon im Windows war das eine Todsünde, aber hier wird es noch schlimmer.
Wer sagt dir, dass es eine SD-Karte gibt und ob sie wirklich dort gemountet wurde?

Weil z.B. zu viele Entwickler sowas wie C:\Windows oder C:\Programme oder C:\Programs benutzt haben, knallten früher ständig irgendwelche Schrottprogramme.

Delphi-Referenz durchsuchenTPath ähhhh Delphi-Referenz durchsuchenIOUtils.TPath
https://stackoverflow.com/questions/...-path-problems


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