package com.sunny.CameraIntent; import android.Manifest; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; import com.google.appinventor.components.annotations.DesignerComponent; import com.google.appinventor.components.annotations.PropertyCategory; import com.google.appinventor.components.annotations.SimpleEvent; import com.google.appinventor.components.annotations.SimpleFunction; import com.google.appinventor.components.annotations.SimpleObject; import com.google.appinventor.components.annotations.SimpleProperty; import com.google.appinventor.components.annotations.UsesPermissions; import com.google.appinventor.components.common.ComponentCategory; import com.google.appinventor.components.runtime.util.NougatUtil; import com.google.appinventor.components.runtime.util.QUtil; import com.google.appinventor.components.runtime.ActivityResultListener; import com.google.appinventor.components.runtime.ComponentContainer; import com.google.appinventor.components.runtime.AndroidNonvisibleComponent; import com.google.appinventor.components.runtime.util.BulkPermissionRequest; import com.google.appinventor.components.runtime.EventDispatcher; import java.io.File; import java.util.Date; @DesignerComponent(version = 1, description = "Developed by Sunny Gupta", category = ComponentCategory.EXTENSION, nonVisible = true, iconName = "https://res.cloudinary.com/andromedaviewflyvipul/image/upload/c_scale,h_20,w_20/v1571472765/ktvu4bapylsvnykoyhdm.png") @SimpleObject(external = true) @UsesPermissions(permissionNames = "android.permission.CAMERA,android.permission.WRITE_EXTERNAL_STORAGE") public class CameraIntent extends AndroidNonvisibleComponent implements ActivityResultListener{ public Activity activity; private boolean havePermission = false; private final ComponentContainer container; public int requestCode; private Uri imageFile; private static final String CAMERA_INTENT = MediaStore.ACTION_IMAGE_CAPTURE; private static final String CAMERA_OUTPUT = MediaStore.EXTRA_OUTPUT; public CameraIntent(ComponentContainer container){ super(container.$form()); this.container = container; activity = container.$context(); requestCode = form.registerForActivityResult(this); } @SimpleFunction() public void StartCaptureActivity(final boolean useFrontCamera){ try{ if (!havePermission) { final CameraIntent me = this; form.askPermission(new BulkPermissionRequest(this, "StartCaptureActivity", Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) { @Override public void onGranted() { me.havePermission = true; me.StartCaptureActivity(useFrontCamera); } }); return; } File directory = new File(QUtil.getExternalStorageDir(form), "Pictures/"); if (!directory.exists()) { directory.mkdir(); } File image = new File(QUtil.getExternalStorageDir(form), "Pictures/app_inventor_" + new Date().getTime() + ".jpg"); imageFile = Uri.fromFile(image); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, imageFile.getPath()); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.TITLE, imageFile.getLastPathSegment()); Uri imageUri; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { imageUri = container.$context().getContentResolver().insert( MediaStore.Images.Media.INTERNAL_CONTENT_URI, values); } else { imageUri = NougatUtil.getPackageUri(form, image); } Intent intent = new Intent(CAMERA_INTENT); intent.putExtra(CAMERA_OUTPUT, imageUri); if (useFrontCamera) { intent.putExtra("android.intent.extras.CAMERA_FACING", 1); } activity.startActivityForResult(intent, requestCode); }catch(Exception e){ e.printStackTrace(); } } @SimpleEvent() public void AfterActivity(String result){ EventDispatcher.dispatchEvent(this, "AfterActivity", result); } @SimpleEvent() public void ActivityCanceled() { EventDispatcher.dispatchEvent(this, "ActivityCanceled"); } @Override public void resultReturned(int requestCode, int resultCode, Intent data) { if (requestCode == this.requestCode) { if (resultCode == Activity.RESULT_OK) { File image = new File(imageFile.getPath()); scanFileToAdd(image); if(image.length() != 0){ AfterActivity(image.toString()); }else if (data != null && data.getData() != null) { deleteFile(); Uri imageUri = data.getData(); AfterActivity(imageUri.toString()); } } else{ deleteFile(); ActivityCanceled(); } } } private void scanFileToAdd(File image) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = NougatUtil.getPackageUri(form, image); mediaScanIntent.setData(contentUri); container.$context().getApplicationContext().sendBroadcast(mediaScanIntent); } private void deleteFile(){ File image = new File(imageFile.getPath()); image.delete(); } }