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.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.