package co.flyver.androidrc.server; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; import java.util.Arrays; /** * Created by Petar Petrov on 10/24/14. */ public class CameraProvider extends SurfaceView implements SurfaceHolder.Callback { private final String CAMERA = "CAMERA"; SurfaceHolder mSurfaceHolder; Camera mCamera; Runnable mCallback; boolean mReady = true; net.majorkernelpanic.streaming.gl.SurfaceView mView; byte[] mLastPicture; public byte[] getLastPicture() { return mLastPicture; } public void setCallback(Runnable callback) { this.mCallback = callback; } public void setView(net.majorkernelpanic.streaming.gl.SurfaceView view) { this.mView = view; } @Override public void surfaceCreated(SurfaceHolder holder) { try { Log.d(CAMERA, "Surface created"); mCamera.setPreviewDisplay(holder); mCamera.setDisplayOrientation(90); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { } private Camera.PictureCallback capturedIt = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); if(bitmap==null) { Log.d(CAMERA, "Picture not taken!"); } else { Log.d(CAMERA, "Picture data length: " + bitmap.getByteCount() / 1024 + "kB"); Log.d(CAMERA, "Picture data: " + Arrays.toString(data)); camera.startPreview(); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } mLastPicture = data; if (mCallback != null) { mCallback.run(); } mReady = true; } }; public void snapIt(){ if(mReady) { mCamera.takePicture(null, null, capturedIt); Log.d(CAMERA, "Pic taken"); mReady = false; } } public void snapIt(Camera camera){ if(mReady) { if(camera != null) { mSurfaceHolder.addCallback(this); try { camera.setPreviewDisplay(mSurfaceHolder); } catch (IOException e) { e.printStackTrace(); } camera.setDisplayOrientation(90); camera.startPreview(); } else { return; } // camera.takePicture(null, null, capturedIt); Log.d(CAMERA, "Pic taken"); mReady = false; } } public CameraProvider(Context context, Camera mCamera) { super(context); this.mCamera = mCamera; mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); } public CameraProvider(Context context) { super(context); mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); } public void init() { Log.d(CAMERA, "Initiated"); // mCamera.startPreview(); } public static Camera getCameraInstance(){ Camera camera = null; try { camera = Camera.open(); // attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) e.printStackTrace(); } return camera; // returns null if mCamera is unavailable } }