Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

(Mobile Application Development) Using Android Studio, Create a camera app that

ID: 3919585 • Letter: #

Question

(Mobile Application Development)

Using Android Studio, Create a camera app that allows the user to upload a picture from their phone camera gallery, see the picture via summary page, and edit the picture as well from the summary page. Clicking on "Insert picture here from camera photo gallery" in the add page will allow the user to upload a picture from their existing camera photo gallery on their phone. The user can choose where to save the picture, starting with Picture 1-5. Once they choose where to save the picture from, they can view that picture in the summary page. In the summary page, the user can see the picture that they uploaded. They can also change or edit the picture that they uploaded using the Edit button from the Summary Page. Clicking on the Edit Button will take you to the Edit page, where the user can click and edit on the Image View from Picture 1-5 and change the picture. Once they hit the "done" button in the Edit page, it will update the new photo added in the Summary Page.

Notes:

1. Make the application according to the requirement. .

2. Do not screenshot, do not write this on paper. Please copy and paste source codes from Android Studio to Chegg.  

3. Please post all codes from both XML and Java codes. If there are any changes in Manifest or values codes, post those as well.  

4. If there are specific instructions on how to get the camera app working, please describe it in the solution.  

5. Screen shot the output, NOT the codes of the camera app.  

INSERT PICTURE HERE FROM Camera photo gallery Clicking on this box allows you to add a picture from your camera photo gallery) Choose where to save Picture in. Picture I Picture 2 ?? Picture 3 Picture 4 scroll Picture 5 ADD PICTURE Add Page

Explanation / Answer

package com.example.cam;

/**

* @author Jose Davis Nidhin

*/

import java.io.IOException;

import java.util.List;

import android.content.Context;

import android.hardware.Camera;

import android.hardware.Camera.Size;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.ViewGroup;

class Preview extends ViewGroup implements SurfaceHolder.Callback {

    private final String TAG = "Preview";

    SurfaceView mSurfaceView;

    SurfaceHolder mHolder;

    Size mPreviewSize;

    List<Size> mSupportedPreviewSizes;

    Camera mCamera;

    Preview(Context context, SurfaceView sv) {

        super(context);

        mSurfaceView = sv;

//        addView(mSurfaceView);

      

        mHolder = mSurfaceView.getHolder();

        mHolder.addCallback(this);

        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    public void setCamera(Camera camera) {

    mCamera = camera;

    if (mCamera != null) {

            mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();

            requestLayout();

            // get Camera parameters

            Camera.Parameters params = mCamera.getParameters();

            List<String> focusModes = params.getSupportedFocusModes();

            if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {

                  // set the focus mode

                  params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

                  // set Camera parameters

                  mCamera.setParameters(params);

            }

    }

    }

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        // We purposely disregard child measurements because act as a

        // wrapper to a SurfaceView that centers the camera preview instead

        // of stretching it.

        final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);

        final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);

        setMeasuredDimension(width, height);

        if (mSupportedPreviewSizes != null) {

            mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);

        }

    }

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        if (changed && getChildCount() > 0) {

            final View child = getChildAt(0);

            final int width = r - l;

            final int height = b - t;

            int previewWidth = width;

            int previewHeight = height;

            if (mPreviewSize != null) {

                previewWidth = mPreviewSize.width;

                previewHeight = mPreviewSize.height;

            }

            // Center the child SurfaceView within the parent.

            if (width * previewHeight > height * previewWidth) {

                final int scaledChildWidth = previewWidth * height / previewHeight;

                child.layout((width - scaledChildWidth) / 2, 0,

                        (width + scaledChildWidth) / 2, height);

            } else {

                final int scaledChildHeight = previewHeight * width / previewWidth;

                child.layout(0, (height - scaledChildHeight) / 2,

                        width, (height + scaledChildHeight) / 2);

            }

        }

    }

    public void surfaceCreated(SurfaceHolder holder) {

        // The Surface has been created, acquire the camera and tell it where

        // to draw.

        try {

            if (mCamera != null) {

                mCamera.setPreviewDisplay(holder);

            }

        } catch (IOException exception) {

            Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);

        }

    }

    public void surfaceDestroyed(SurfaceHolder holder) {

        // Surface will be destroyed when we return, so stop the preview.

        if (mCamera != null) {

            mCamera.stopPreview();

        }

    }

    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {

        final double ASPECT_TOLERANCE = 0.1;

        double targetRatio = (double) w / h;

        if (sizes == null) return null;

        Size optimalSize = null;

        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        // Try to find an size match aspect ratio and size

        for (Size size : sizes) {

            double ratio = (double) size.width / size.height;

            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;

            if (Math.abs(size.height - targetHeight) < minDiff) {

                optimalSize = size;

                minDiff = Math.abs(size.height - targetHeight);

            }

        }

        // Cannot find the one match the aspect ratio, ignore the requirement

        if (optimalSize == null) {

            minDiff = Double.MAX_VALUE;

            for (Size size : sizes) {

                if (Math.abs(size.height - targetHeight) < minDiff) {

                    optimalSize = size;

                    minDiff = Math.abs(size.height - targetHeight);

                }

            }

        }

        return optimalSize;

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    if(mCamera != null) {

            Camera.Parameters parameters = mCamera.getParameters();

            parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

            requestLayout();

            mCamera.setParameters(parameters);

            mCamera.startPreview();

    }

    }

}

package com.example.cam;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.hardware.Camera;

import android.hardware.Camera.PictureCallback;

import android.hardware.Camera.ShutterCallback;

import android.net.Uri;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.view.SurfaceView;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnLongClickListener;

import android.view.ViewGroup.LayoutParams;

import android.view.Window;

import android.view.WindowManager;

import android.widget.Button;

import android.widget.FrameLayout;

import android.widget.Toast;

public class CamTestActivity extends Activity {

      private static final String TAG = "CamTestActivity";

      Preview preview;

      Button buttonClick;

      Camera camera;

      Activity act;

      Context ctx;

      @Override

      public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            ctx = this;

            act = this;

            requestWindowFeature(Window.FEATURE_NO_TITLE);

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

            setContentView(R.layout.main);

            preview = new Preview(this, (SurfaceView)findViewById(R.id.surfaceView));

            preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

            ((FrameLayout) findViewById(R.id.layout)).addView(preview);

            preview.setKeepScreenOn(true);

            preview.setOnClickListener(new OnClickListener() {

                  @Override

                  public void onClick(View arg0) {

                        camera.takePicture(shutterCallback, rawCallback, jpegCallback);

                  }

            });

            Toast.makeText(ctx, getString(R.string.take_photo_help), Toast.LENGTH_LONG).show();

           

      @Override

      protected void onResume() {

            super.onResume();

            int numCams = Camera.getNumberOfCameras();

            if(numCams > 0){

                  try{

                        camera = Camera.open(0);

                        camera.startPreview();

                        preview.setCamera(camera);

                  } catch (RuntimeException ex){

                        Toast.makeText(ctx, getString(R.string.camera_not_found), Toast.LENGTH_LONG).show();

                  }

            }

      }

      @Override

      protected void onPause() {

            if(camera != null) {

                  camera.stopPreview();

                  preview.setCamera(null);

                  camera.release();

                  camera = null;

            }

            super.onPause();

      }

      private void resetCam() {

            camera.startPreview();

            preview.setCamera(camera);

      }

      private void refreshGallery(File file) {

            Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

            mediaScanIntent.setData(Uri.fromFile(file));

            sendBroadcast(mediaScanIntent);

      }

      ShutterCallback shutterCallback = new ShutterCallback() {

            public void onShutter() {

           

            }

      };

      PictureCallback rawCallback = new PictureCallback() {

            public void onPictureTaken(byte[] data, Camera camera) {

           

            }

      };

      PictureCallback jpegCallback = new PictureCallback() {

            public void onPictureTaken(byte[] data, Camera camera) {

                  new SaveImageTask().execute(data);

                  resetCam();

                  Log.d(TAG, "onPictureTaken - jpeg");

            }

      };

      private class SaveImageTask extends AsyncTask<byte[], Void, Void> {

            @Override

            protected Void doInBackground(byte[]... data) {

                  FileOutputStream outStream = null;

                  // Write to SD Card

                  try {

                        File sdCard = Environment.getExternalStorageDirectory();

                        File dir = new File (sdCard.getAbsolutePath() + "/camtest");

                        dir.mkdirs();                      

                        String fileName = String.format("%d.jpg", System.currentTimeMillis());

                        File outFile = new File(dir, fileName);

                        outStream = new FileOutputStream(outFile);

                        outStream.write(data[0]);

                        outStream.flush();

                        outStream.close();

                        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath());

                        refreshGallery(outFile);

                  } catch (FileNotFoundException e) {

                        e.printStackTrace();

                  } catch (IOException e) {

                        e.printStackTrace();

                  } finally {

                  }

                  return null;

            }

      }

}