package uk.co.metricrat.camerabase64; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.provider.MediaStore; import android.util.Base64; import com.google.appinventor.components.annotations.SimpleEvent; import com.google.appinventor.components.annotations.SimpleFunction; import com.google.appinventor.components.runtime.ActivityResultListener; import com.google.appinventor.components.runtime.AndroidNonvisibleComponent; import com.google.appinventor.components.runtime.ComponentContainer; import com.google.appinventor.components.runtime.EventDispatcher; import com.google.appinventor.components.runtime.errors.YailRuntimeError; import java.io.ByteArrayOutputStream; public class CameraBase64 extends AndroidNonvisibleComponent implements ActivityResultListener { final Activity activity; private final int requestCapture; public CameraBase64(ComponentContainer container) { super(container.$form()); this.activity = container.$context(); requestCapture = form.registerForActivityResult(this); } @SimpleFunction(description = "Takes Thumbnail Picture with Camera and returns base64 string") public void TakeThumbnailPictureAsBase64() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { this.activity.startActivityForResult(takePictureIntent, requestCapture); } catch (ActivityNotFoundException e) { throw new YailRuntimeError(e.getMessage(), "Cannot start activity"); } } @Override public void resultReturned(int requestCode, int resultCode, Intent data) { if (requestCode == requestCapture && resultCode == Activity.RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); String encodedString = bitMapToBase64(imageBitmap); AfterPictureBase64(encodedString); } } public String bitMapToBase64(Bitmap bitMap) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitMap.compress(Bitmap.CompressFormat.PNG, 50, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream.toByteArray(); return Base64.encodeToString(byteArray, Base64.DEFAULT); } @SimpleEvent(description = "Called after the picture is taken. The text argument `base64Data` is the base64 string of the image") public void AfterPictureBase64(String base64Data) { EventDispatcher.dispatchEvent(this, "AfterPictureBase64", base64Data); } }