Пример моего кода:
interface
type
TMyForm = class(TForm)
{ ... }
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
{$IFDEF ANDROID}
procedure ImageFileMessageListener(const Sender: TObject; const M: TMessage);
{$ENDIF}
{$IFDEF IOS}
procedure ImageFileFinish(Image: TBitmap);
{$ENDIF}
procedure ImageFromLibraryClick(Sender: TObject);
{ ... }
private
{ ... }
procedure ApplyImage(Image: TBitmap);
{ ... }
end;
implementation
procedure TMyForm.FormCreate(Sender: TObject);
begin
{$IF DEFINED(ANDROID)}
TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromLibrary, ImageFileMessageListener);
{$ENDIF}
end;
procedure TMyForm.FormDestroy(Sender: TObject);
begin
{$IF DEFINED(ANDROID)}
TMessageManager.DefaultManager.Unsubscribe(TMessageDidFinishTakingImageFromLibrary, ImageFileMessageListener, True);
{$ENDIF}
end;
{$IFDEF ANDROID}
procedure TMyForm.ImageFileMessageListener(const Sender: TObject; const M: TMessage);
begin
try
if M is TMessageDidFinishTakingImageFromLibrary then
ApplyImage(TMessageDidFinishTakingImageFromLibrary(M).Value);
except
{ code for exception handle }
end;
end;
{$ENDIF}
{$IFDEF IOS}
procedure TMyForm.ImageFileFinish(Image: TBitmap);
begin
try
ApplyImage(Image);
except
{ code for exception handle }
end;
end;
{$ENDIF}
procedure TMyForm.ImageFromLibraryClick(Sender: TObject);
{$IF DEFINED(ANDROID) OR DEFINED(IOS)}
var
LImageService: IFMXTakenImageService;
LImageParams: TParamsPhotoQuery;
{$ENDIF}
begin
if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService, IInterface(LImageService)) then
begin
LImageParams.RequiredResolution := TSize.Create(1024, 1024);
LImageParams.Editable := False;
LImageParams.NeedSaveToAlbum := False;
// под Android обработчик OnDidFinishTaking указывать нельзя, т.к. это может привести к рестарту программы
// см. http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.MediaLibrary.TMessageDidFinishTakingImageFromLibrary
LImageParams.OnDidFinishTaking := {$IFDEF IOS}ImageFileFinish{$ELSE}nil{$ENDIF};
LImageParams.OnDidCancelTaking := nil;
LImageService.TakeImageFromLibrary({$IFDEF IOS}ImageFile{$ELSE}nil{$ENDIF}, LImageParams);
end
else
raise Exception.Create('No image library access');
end;
procedure TMyForm.ApplyImage(Image: TBitmap);
begin
{ code for received image }
end;