package com.yokmama.learn10.chapter10.lesson42; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.net.Uri; import android.opengl.GLSurfaceView; import android.os.Environment; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.SeekBar; import com.yokmama.learn10.chapter10.lesson42.utils.CameraHelper; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import jp.co.cyberagent.android.gpuimage.GPUImage; import jp.co.cyberagent.android.gpuimage.GPUImage.OnPictureSavedListener; import jp.co.cyberagent.android.gpuimage.GPUImageFilter; public class MainActivity extends ActionBarActivity implements SeekBar.OnSeekBarChangeListener, View.OnClickListener { private GPUImage mGPUImage; private CameraHelper mCameraHelper; private CameraLoader mCamera; private GPUImageFilter mFilter; private GPUImageFilterTools.FilterAdjuster mFilterAdjuster; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((SeekBar) findViewById(R.id.seekBar)).setOnSeekBarChangeListener(this); findViewById(R.id.button_choose_filter).setOnClickListener(this); findViewById(R.id.button_capture).setOnClickListener(this); mGPUImage = new GPUImage(this); mGPUImage.setGLSurfaceView((GLSurfaceView) findViewById(R.id.surfaceView)); mCameraHelper = new CameraHelper(this); mCamera = new CameraLoader(); View cameraSwitchView = findViewById(R.id.img_switch_camera); cameraSwitchView.setOnClickListener(this); if (!mCameraHelper.hasFrontCamera() || !mCameraHelper.hasBackCamera()) { cameraSwitchView.setVisibility(View.GONE); } } @Override protected void onResume() { super.onResume(); mCamera.onResume(); } @Override protected void onPause() { mCamera.onPause(); super.onPause(); } @Override public void onClick(final View v) { switch (v.getId()) { case R.id.button_choose_filter: GPUImageFilterTools.showDialog(this, new GPUImageFilterTools.OnGpuImageFilterChosenListener() { @Override public void onGpuImageFilterChosenListener(final GPUImageFilter filter) { switchFilterTo(filter); } }); break; case R.id.button_capture: if (mCamera.mCameraInstance.getParameters().getFocusMode().equals( Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { takePicture(); } else { mCamera.mCameraInstance.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(final boolean success, final Camera camera) { takePicture(); } }); } break; case R.id.img_switch_camera: mCamera.switchCamera(); break; } } private void takePicture() { // TODO get a size that is about the size of the screen Camera.Parameters params = mCamera.mCameraInstance.getParameters(); params.setRotation(90); mCamera.mCameraInstance.setParameters(params); for (Camera.Size size : params.getSupportedPictureSizes()) { Log.i("ASDF", "Supported: " + size.width + "x" + size.height); } mCamera.mCameraInstance.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, final Camera camera) { final File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); if (pictureFile == null) { Log.d("ASDF", "Error creating media file, check storage permissions"); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.d("ASDF", "File not found: " + e.getMessage()); } catch (IOException e) { Log.d("ASDF", "Error accessing file: " + e.getMessage()); } data = null; Bitmap bitmap = BitmapFactory.decodeFile(pictureFile.getAbsolutePath()); // mGPUImage.setImage(bitmap); final GLSurfaceView view = (GLSurfaceView) findViewById(R.id.surfaceView); view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); mGPUImage.saveToPictures(bitmap, "GPUImage", System.currentTimeMillis() + ".jpg", new OnPictureSavedListener() { @Override public void onPictureSaved(final Uri uri) { pictureFile.delete(); camera.startPreview(); view.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } }); } }); } public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_VIDEO = 2; private static File getOutputMediaFile(final int type) { // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. // Create the storage directory if it does not exist if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("MyCameraApp", "failed to create directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if (type == MEDIA_TYPE_IMAGE) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); } else if (type == MEDIA_TYPE_VIDEO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4"); } else { return null; } return mediaFile; } private void switchFilterTo(final GPUImageFilter filter) { if (mFilter == null || (filter != null && !mFilter.getClass().equals(filter.getClass()))) { mFilter = filter; mGPUImage.setFilter(mFilter); mFilterAdjuster = new GPUImageFilterTools.FilterAdjuster(mFilter); } } @Override public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) { if (mFilterAdjuster != null) { mFilterAdjuster.adjust(progress); } } @Override public void onStartTrackingTouch(final SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { } private class CameraLoader { private int mCurrentCameraId = 0; private Camera mCameraInstance; public void onResume() { setUpCamera(mCurrentCameraId); } public void onPause() { releaseCamera(); } public void switchCamera() { releaseCamera(); mCurrentCameraId = (mCurrentCameraId + 1) % mCameraHelper.getNumberOfCameras(); setUpCamera(mCurrentCameraId); } private void setUpCamera(final int id) { mCameraInstance = getCameraInstance(id); Camera.Parameters parameters = mCameraInstance.getParameters(); // TODO adjust by getting supportedPreviewSizes and then choosing // the best one for screen size (best fill screen) if (parameters.getSupportedFocusModes().contains( Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } mCameraInstance.setParameters(parameters); int orientation = mCameraHelper.getCameraDisplayOrientation( MainActivity.this, mCurrentCameraId); CameraHelper.CameraInfo2 cameraInfo = new CameraHelper.CameraInfo2(); mCameraHelper.getCameraInfo(mCurrentCameraId, cameraInfo); boolean flipHorizontal = cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT; mGPUImage.setUpCamera(mCameraInstance, orientation, flipHorizontal, false); } /** A safe way to get an instance of the Camera object. */ private Camera getCameraInstance(final int id) { Camera c = null; try { c = mCameraHelper.openCamera(id); } catch (Exception e) { e.printStackTrace(); } return c; } private void releaseCamera() { mCameraInstance.setPreviewCallback(null); mCameraInstance.release(); mCameraInstance = null; } } }