you can try this:
cn.kevinkun.SpriteBase64.aix (4.6 KB)
spriteplus.aia (26.2 KB)
source code:
package cn.kevinkun.SpriteBase64;
import java.lang.reflect.Field;
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.runtime.ImageSprite;
import com.google.appinventor.components.runtime.errors.YailRuntimeError;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.util.Base64;
@DesignerComponent(version = 1, versionName = "1.0", description = "set ImageSprite Picture with base64 string.", category = ComponentCategory.EXTENSION, nonVisible = true, iconName = "images/extension.png", helpUrl = "https://kevinkun.cn")
@SimpleObject(external = true)
public class SpriteBase64 extends AndroidNonvisibleComponent {
public SpriteBase64(ComponentContainer container) {
super(container.$form());
}
@SimpleFunction
public void PictureFromBase64(ImageSprite sprite, String base64) {
try {
byte[] bytes = Base64.decode(base64, Base64.DEFAULT);
Bitmap myBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
BitmapDrawable drawable = new BitmapDrawable(myBitmap);
Field field = sprite.getClass().getDeclaredField("drawable");
field.setAccessible(true);
field.set(sprite, drawable);
sprite.Width(sprite.Width());
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
throw new YailRuntimeError(e.getMessage(), "err");
}
}
}