VideoCapturer.java :  » UnTagged » moteve » com » moteve » mca » Android Open Source

Android Open Source » UnTagged » moteve 
moteve » com » moteve » mca » VideoCapturer.java
package com.moteve.mca;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class VideoCapturer extends Activity implements SurfaceHolder.Callback {

    public static final String FILE_BASE = "/sdcard/m-video_"; // TODO: replace
    // with temp
    // files
    private static final String MEDIA_FORMAT = "3GPP-H.263-AMR_NB";
    private static final String TAG = "Moteve_VideoCapturer";
    public static final int MEDIA_DURATION = 5000;
    private SurfaceView surfaceView;
    private SurfaceHolder holder;
    private MediaRecorder recorder;
    // private VideoUploader uploader = new VideoUploader();
    private int part = 0;
    private String sequenceId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.video_capture);

  surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
  holder = surfaceView.getHolder();
  holder.addCallback(this);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  setSequenceId();
  recorder = new MediaRecorder();

  Button cancelButton = (Button) findViewById(R.id.stop);
  cancelButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
    finish();
      }
  });

  recorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
      @Override
      public void onInfo(MediaRecorder mr, int what, int extra) {
    switch (what) {
    case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
            swapFiles();
    }
      }
  });
    }

    /**
     * Remember current part no., prepare() new recorder and in the meantime the
     * current file should be closed. Then upload it.
     */
    private void swapFiles() {
  int oldPart = part;
  part++;
  Log.d(TAG, "Swapping media files. old=" + buildFileName(oldPart)
    + ", new=" + buildFileName(part));
  prepareRecorder(MEDIA_DURATION, buildFileName(part));
  recorder.start();
  uploadFile(oldPart);
    }

    private void setSequenceId() {
  try {
      Toast.makeText(this, "Obtaining sequence ID from server",
        Toast.LENGTH_SHORT).show();
      String token = Main.getPrefs().getString("token", null);
      String defaultGroup = Main.getPrefs().getString("defaultGroup",
        "JUST_ME");
      this.sequenceId = VideoUploader.startVideo(token, MEDIA_FORMAT,
        defaultGroup);
      Toast.makeText(this, "Sequence ID received: " + sequenceId, Toast.LENGTH_SHORT)
        .show();
  } catch (IOException e) {
      Log.e(TAG, "Error getting sequence ID from server: "
        + e.getMessage(), e);
      Toast.makeText(this,
        "Error getting sequence ID from server: " + e.getMessage(),
        Toast.LENGTH_LONG).show();
      finish();
  }
    }

    private void prepareRecorder(int maxDuration, String outputFile) {
  Log.i(TAG, "Preparing MediaRecorder; outputFile=" + outputFile);
  try {
      recorder.reset();

      recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
      recorder.setMaxDuration(maxDuration);

      // recorder.setVideoFrameRate(rate)
      // recorder.setVideoSize(width, height)

      recorder.setOutputFile(outputFile);
      recorder.setPreviewDisplay(holder.getSurface());
      recorder.prepare();
  } catch (Exception e) {
      Log.e(TAG, "Error preparing MediaRecorder: " + e.getMessage(), e);
      Toast.makeText(this,
        "Error preparing MediaRecorder: " + e.getMessage(),
        Toast.LENGTH_LONG).show();
      finish();
  }
    }

    @Override
    protected void onPause() {
  try {
      super.onPause();
      // recorder.stop(); // don't call stop - it already might be stopped
      // after maxDuration
      recorder.reset();
      File f = new File(buildFileName(part));
      long fileLength = f.length();
      Log.i(TAG, "Recorded video file size: " + f.length() + " B");
      // uploader.stopRecording();
      if (fileLength > 0) {
    uploadFile(part);
      }
      String token = Main.getPrefs().getString("token", null);
      VideoUploader.closeSequence(sequenceId, token);
  } catch (Exception e) {
      Log.e(TAG, "Error closing video: " + e.getMessage(), e);
      Toast.makeText(this, "Error closing video: " + e.getMessage(),
        Toast.LENGTH_LONG).show();
  }
    }

    private void uploadFile(int part) {
  Log.d(TAG, "uploadFile part=" + part);
  VideoUploader uploader = new VideoUploader(buildFileName(part),
    sequenceId, String.valueOf(part),
    this);
  (new Thread(uploader)).start();
    }

    @Override
    protected void onDestroy() {
  super.onDestroy();
  recorder.reset();
  recorder.release();
  recorder = null;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
      int height) {
  Log.d(TAG, "surfaceChanged called");
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
  Log.d(TAG, "surfaceCreated called");
  prepareRecorder(MEDIA_DURATION, buildFileName(part));
  recorder.start();
  // uploader.startRecording();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
  Log.d(TAG, "surfaceDestroyed called");
    }

    private String buildFileName(int part) {
  return FILE_BASE + part + ".3gp";
    }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.