Loading the app’s icon into a TImage on Android

  

Working with Delphi for Android, I wanted to load my app’s icon into a TImage. Here’s the code I came up with:

uses
AndroidApi.JniBridge, AndroidApi.Jni.App, AndroidApi.Jni.GraphicsContentViewText,
FMX.Helpers.Android, FMX.Surfaces;

function GetAppIcon(Dest: TBitmap): Boolean;
var
Activity: JActivity;
Drawable: JDrawable;
Bitmap: JBitmap;
Surface: TBitmapSurface;
begin
Result := False;
Activity := SharedActivity;
Drawable := Activity.getPackageManager.getApplicationIcon(Activity.getApplicationInfo);
Bitmap := TJBitmapDrawable.Wrap((Drawable as ILocalObject).GetObjectID).getBitmap;
Surface := TBitmapSurface.Create;
try
if not JBitmapToSurface(Bitmap, Surface) then
Exit;
Dest.Assign(Surface);
finally
Surface.Free;
end;
Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetAppIcon(Image1.MultiResBitmap[0].Bitmap);
end;

The slightly awkward manner of casting from a JDrawable to a JBitmapDrawable in the middle is because Java type casts are not supported directly by the Delphi to Java bridge. As such, we have to get a handle to the raw Java object and re-wrap it to the desired derived class… but that’s too much of a faff all told, and the syntax will be familiar with anyone who has used the Delphi to Objective-C bridge before.

Comments are closed.