Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Bild in galerie ablegen (iOS, Android) (https://www.delphipraxis.net/196942-bild-galerie-ablegen-ios-android.html)

knaeuel 2. Jul 2018 13:36

Bild in galerie ablegen (iOS, Android)
 
Hallo zusammen,

ich suche seit einigen Wochen nach einer Lösung für dieses Problem und habe für iOS noch nichts funktionierendes gefunden.

Ich möchte ein Bild (Format recht frei wählbar, png, jpg, …, notfalls auch bmp) aus meiner App heraus in der Galerie oder in einer Art Benutzerdaten-Ordner speichern.

Unter Android habe ich zumindest schon eine funktionierende Lösung. Für iOS hab ich noch nichts zum Laufen gebracht.

Delphi-Quellcode:
procedure TFormX.BildInGalerieSpeichern;
var photolib:IFMXPhotoLibrary;
    mybmp:TBitmap;
    bmpname:string;
begin
  {$IFDEF ANDROID}
    if TPlatformServices.Current.SupportsPlatformService(IFMXPhotoLibrary) then
    begin
      //Zugriff auf Galerie ergattern:
      photolib:=TPlatformServices.Current.GetPlatformService(IFMXPhotoLibrary) as IFMXPhotoLibrary;
      //Bitmap erzeugen
      mybmp := Chart1.TeeCreateBitmap(clWhite,Rect(0,0,ceil(Chart1.Width),ceil(Chart1.Height)));
      //Bitmap in Galerie pflanzen
      photolib.AddImageToSavedPhotosAlbum(mybmp);
      //Bitmap freigeben
      mybmp.Free;
    end;
  {$ENDIF}
end;
Hat jemand eine Lösung für iOS? Ich will nur irgendwo speichern können, so dass der Benutzer anschließend ohne die App auf das Bild zugreifen kann. Wo genau ist mir im Grunde fast egal, nur auf dem Gerät selber sollte es schon sein (also nicht in der Cloud).


Danke schon vorab!

Sherlock 2. Jul 2018 13:57

AW: Bild in galerie ablegen (iOS, Android)
 
Ist eigentlich ziemlich einfach Code ungefähr so aus der Delphi Hilfe):
Delphi-Quellcode:
var
  service: IFMXPhotoLibrary;
.
.
.
try
  if TPlatformServices.Current.SupportsPlatformService(IFMXPhotoLibrary, service) then
    service.AddImageToSavedPhotosAlbum(fMyPicture)
  else
    ShowMessage('The IFMXPhotoLibrary interface is not supported.');
except
  ShowMessage('IFMXPhotoLibrary.AddImageToPhotoAlbum failed');
end;
Der Knackpunkt ist allerdings die Berechtigung zum Schreiben ins Album. Das wird gesetzt durch die info.plist Einträge
NSPhotoLibraryUsageDescription und NSPhotoLibraryAddUsageDescription (Man beachte den feinen Unterschied, nötig ab iOS 11). vgl. dazu https://stackoverflow.com/questions/...photolibraryus

Der erste eintrag ist von Emba freundlicherweise schon abgelegt, den zweiten mußt du manuell in den Versionsinfos Deines Projekts hinzufügen, und mit einem mehr oder minder sinnigen Text hinterlegen (je nachdem, was Du Deinen Anwendern zumuten möchtest).

Sherlock

knaeuel 10. Sep 2018 12:02

AW: Bild in galerie ablegen (iOS, Android)
 
es hat etwas gedauert, bis ich wieder zu diesem Problem vorgedrungen bin.

Albernerweise ist der Code für iOS und Android identisch. Die Lösung, die ich am Anfang für Android gepostet habe, funzt auch mit iOS (11.3).

kleines Edit für iOS:
Die Berechtigungen muss man, genau wie von Sherlock beschrieben, ergänzen:
Unter Projekt->Optionen->Versionsinformationen zunächst schauen, dass oben als "Ziel" die gewünschte iOS-Konfiguration ausgewählt ist.
Wenn das korrekt eingestellt ist, müssen unten die beiden Schlüssel

"NSPhotoLibraryAddUsageDescription" und
"NSPhotoLibraryUsageDescription"

vorhanden sein. Der Wert dahinter ist die Erklärung, die iOS bei der Berechtigungsabfrage anzeigt, ist also gewissermaßen beliebig, nur leer würd ichs nicht lassen (habs aber nicht probiert).


Delphi-Quellcode:
uses FMX.Platform,FMX.MediaLibrary;

procedure TFormChart.BildInGalerieSpeichern;
var photolib:IFMXPhotoLibrary;
    mybmp:TBitmap;
begin
  {$IF Defined(ANDROID) OR Defined(IOS)}
    if TPlatformServices.Current.SupportsPlatformService(IFMXPhotoLibrary) then
    begin
      //Zugriff auf Galerie ergattern:
      photolib:=TPlatformServices.Current.GetPlatformService(IFMXPhotoLibrary) as IFMXPhotoLibrary;
      //Bitmap erzeugen (hier aus einem TeeChart)
      mybmp := Chart1.TeeCreateBitmap(clWhite,Rect(0,0,ceil(Chart1.Width),ceil(Chart1.Height)));
      //Bitmap in Galerie pflanzen
      photolib.AddImageToSavedPhotosAlbum(mybmp);//Bild vom Typ TBitmap einfügen
      //Bitmap freigeben
      mybmp.Free;
    end;
  {$ENDIF}
end;
für Android mit API Level 26 braucht es allerdings inzwischen eine Permission-Abfrage zur Laufzeit.
Ich nutze dafür die KastriFree Library https://github.com/DelphiWorlds/KastriFree (Demos inklusive)

mkinzler 10. Sep 2018 12:12

AW: Bild in galerie ablegen (iOS, Android)
 
Zitat:

Albernerweise ist der Code für iOS und Android identisch. Die Lösung, die ich am Anfang für Android gepostet habe, funzt auch mit iOS (11.3).
Warum albern? Der Code abstrahiert die Plattformen.

knaeuel 10. Sep 2018 12:17

AW: Bild in galerie ablegen (iOS, Android)
 
na weil ichs damals (bei threaderstellung) nicht bemerkt habe. aus irgendeinem grund hats damals nicht geklappt, lag aber wohl nicht an den entscheidenden Zeilen sondern an irgendwas anderem.

Sherlock 10. Sep 2018 13:20

AW: Bild in galerie ablegen (iOS, Android)
 
Gratuliere! :thumb:

Sherlock


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