/******************************************************************************* * Created by Orlando Aliaga * Copyright 2015 Prey Inc. All rights reserved. * License: GPLv3 * Full license at "/LICENSE" ******************************************************************************/ package com.prey.activities; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceHolder; import android.view.SurfaceView; import com.prey.PreyConfig; import com.prey.PreyLogger; import com.prey.R; import com.prey.net.PreyHttpResponse; import com.prey.net.PreyRestHttpClient; import com.prey.net.PreyWebServices; import com.prey.net.http.EntityFile; public class SimpleVideoActivity extends Activity implements SurfaceHolder.Callback { public static SimpleVideoActivity activity = null; private static Camera mServiceCamera; private MediaRecorder mMediaRecorder; private SurfaceHolder mSurfaceHolder; public static byte[] dataImagen = null; private File directory; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_camera); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); activity = null; SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView1); mSurfaceHolder = surfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); try { Context ctx = getApplicationContext(); PreyConfig preyConfig = PreyConfig.getPreyConfig(ctx); if (preyConfig.isGingerbreadOrAbove()) { mServiceCamera = getCameraGingerbreadOrAbove(ctx); } else { mServiceCamera = getCamera(ctx); } } catch (Exception e) { PreyLogger.e("Error open camera:" + e.getMessage(), e); } activity = this; } public void sendVideo(Context ctx) { PreyConfig preyConfig = PreyConfig.getPreyConfig(ctx); try { String uniqueOutFile = Environment.getExternalStorageDirectory() .toString() + "/videooutput.mp4"; File file = new File(uniqueOutFile); PreyLogger.i("size:" + file.length()); FileInputStream fis = new FileInputStream(file); EntityFile entityFile = new EntityFile(); entityFile.setFile(fis); entityFile.setMimeType("video/mp4"); entityFile.setName("video.mp4"); entityFile.setType("video"); Map<String, String> parameters = new HashMap<String, String>(); String uri = PreyWebServices.getInstance().getFileUrlJson(ctx); List<EntityFile> entityFiles = new ArrayList<EntityFile>(); entityFiles.add(entityFile); PreyHttpResponse preyHttpResponse = null; preyHttpResponse = PreyRestHttpClient .getInstance(ctx) .postAutentication(uri, parameters, entityFiles); ; PreyLogger.i("status line:" + preyHttpResponse.getStatusCode()); } catch (Exception e) { PreyLogger.e("Error causa:" + e.getMessage() + e.getMessage(), e); } } public void takeVideo() { try { // mServiceCamera.setDisplayOrientation(90); Camera.Parameters params = mServiceCamera.getParameters(); mServiceCamera.setParameters(params); Camera.Parameters p = mServiceCamera.getParameters(); mServiceCamera.setParameters(p); // mServiceCamera.unlock(); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setCamera(mServiceCamera); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); //mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); directory = new File(Environment.getExternalStorageDirectory() .toString() + "/"); if (!directory.exists()) directory.mkdirs(); String uniqueOutFile = Environment.getExternalStorageDirectory() .toString() + "/videooutput.mp4"; File outFile = new File(directory, uniqueOutFile); if (outFile.exists()) { outFile.delete(); } mMediaRecorder.setOutputFile(uniqueOutFile); // mMediaRecorder.setVideoFrameRate(80); mMediaRecorder.setVideoSize(320, 240); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setMaxDuration(20000); // 20 seconds mMediaRecorder.setMaxFileSize(2000000); // Approximately 2 megabytes // mMediaRecorder.setOrientationHint(90); mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (Exception e) { PreyLogger.e("causa: " + e.getMessage(), e); } } public void stopRecording() { try { mMediaRecorder.stop(); mMediaRecorder.release(); } catch (Exception e) { } try { if (mServiceCamera != null) { mServiceCamera.stopPreview(); mServiceCamera.release(); mServiceCamera = null; } } catch (Exception e) { } PreyLogger.i("recording service stopped"); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } protected void onDestroy() { super.onDestroy(); } public void surfaceCreated(SurfaceHolder holder) { PreyLogger.i("camera setPreviewDisplay()"); mSurfaceHolder = holder; try { if (mServiceCamera != null) mServiceCamera.setPreviewDisplay(mSurfaceHolder); } catch (Exception e) { PreyLogger.e("Error PreviewDisplay:" + e.getMessage(), e); } } public void surfaceDestroyed(SurfaceHolder holder) { PreyLogger.d("camera surfaceDestroyed()"); if (mServiceCamera != null) { mServiceCamera.stopPreview(); mServiceCamera.release(); mServiceCamera = null; } } private Camera getCamera(Context ctx) { return Camera.open(); } @SuppressWarnings("rawtypes") private Camera getCameraGingerbreadOrAbove(Context ctx) { PreyLogger.d("getCameraGingerbreadOrAbove"); Camera mCamera = null; try { Class noparams[] = {}; Class clsCamera; clsCamera = Class.forName("android.hardware.Camera"); Method methodGetNumberOfCameras = clsCamera.getMethod("getNumberOfCameras", noparams); Integer numberOfCamerasInt = (Integer) methodGetNumberOfCameras.invoke(null, null); // int numberOfCameras = Camera.getNumberOfCameras(); // android.hardware.Camera.CameraInfo cameraInfo = new // android.hardware.Camera.CameraInfo(); if (numberOfCamerasInt != null) { if (numberOfCamerasInt == 1) { mCamera = getCamera(0, clsCamera); } else { mCamera = getCamera(1, clsCamera); } } } catch (Exception e1) { PreyLogger.d("Camera failed to open facing front: " + e1.getMessage()); mCamera = null; } if (mCamera == null) { mCamera = Camera.open(); } return mCamera; } @SuppressWarnings("rawtypes") private Camera getCamera(int idx, Class clsCamera) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException { Camera mCamera = null; try { Class[] param = new Class[1]; param[0] = Integer.TYPE; Method methodOpen = clsCamera.getMethod("open", param); Integer[] input = {Integer.valueOf(idx)}; mCamera = (Camera) methodOpen.invoke(null, input); PreyLogger.d("Camera.open(camIdx)"); // mCamera = Camera.open(camIdx); } catch (RuntimeException e) { PreyLogger.d("Camera failed to open: " + e.getMessage()); } return mCamera; } }