Base64 Image Data to Image Sprite

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");
		}
	}

}

4 Likes