2011-09-19 66 views
4

如果任何人有任何想法,如何正面和背面攝像頭之間使用MediaRecorder時切換。我定義了這個函數的按鈕,但不知道如何定義onclickListener。如何使用時,正面和背面攝像頭之間切換MediaRecorder的Android

總活性如下:

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

import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.hardware.Camera; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.SurfaceHolder.Callback; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class Test_cameraActivity extends Activity implements Callback { 

    // Camera variables to fiddle with video preview. 
    // private Camera cam; 
    // Viewholders etc 
    private SurfaceHolder recordViewHolder; 
    private SurfaceView recordSurface; 
    private int width, height; 
    // Button 
    private Button recordBut; 
    private Button switchBut; 
    private Button libraryBut; 

    private final static String DIRECTORY = "/hdrecorder"; // Directory where 
                  // the film is 
                  // stored 
    private final static String recordFileName = "/hdtestfile.mp4"; 
    private final static String saveFileName = "/hdsavefile.mp4"; 
    private MyMediaRecorder recorder = null; 
    private final static String LOG_TAG = "HD Recorder"; 
    private String filePath; 

    // Activity overrides 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // ******************************************* 
     // fullscreen mode 
     // ******************************************* 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     // ******************************************* 

     setContentView(R.layout.main); 

     File dir = new File(Environment.getExternalStorageDirectory() 
       + DIRECTORY); 
     if (!dir.exists()) { 
      if (dir.mkdir()) { 
       Log.v(LOG_TAG, "Created directory"); 
      } else { 
       Log.v(LOG_TAG, "Failed to create Directory"); 
      } 
     } 

     File videoFile = new File(Environment.getExternalStorageDirectory() 
       + DIRECTORY + recordFileName); 

     if (!videoFile.exists()) { 
      videoFile.delete(); // Reset recording 
     } 

     filePath = videoFile.getAbsolutePath(); 
     Log.v(LOG_TAG, "PATH:" + filePath); 
     Log.v(LOG_TAG, "PATH:" + filePath); 

     recordSurface = (SurfaceView) findViewById(R.id.videoSurface); 
     recordBut = (Button) findViewById(R.id.RecordBut); 
     recordBut.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (recorder.getState() != MyMediaRecorder.RECORDING) { 
        startRecord(); 
       } else { 
        stopRecord(); 
        recorder.release(); 
        moveRecordFileToSave(); 
        if (recorder == null) { 
         Log.v(LOG_TAG, "Recorder is null"); 
        } 
        Log.v(LOG_TAG, "Value of recorder:" + recorder); 
        createRecorder(); 
        initiateRecorder(recordViewHolder, width, height); 
       } 
      } 
     }); 

     switchBut = (Button) findViewById(R.id.SwitchBut); 
     switchBut.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 


      } 
     }); 

     libraryBut = (Button) findViewById(R.id.LibraryBut); 
     libraryBut.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(Test_cameraActivity.this, 
         FileExplorer.class); 
       Test_cameraActivity.this.startActivity(intent); 
      } 
     }); 

     recordViewHolder = recordSurface.getHolder(); 
     recordViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     recordViewHolder.addCallback(this); 
     // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     createRecorder(); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.v(LOG_TAG, "OnStart"); 
     if (recorder != null) { 
      if (recorder.getState() == MyMediaRecorder.RELEASED) { 
       createRecorder(); 
      } 
     } 
     Log.v(LOG_TAG, "SurfaceView create initiated. OnStart Done"); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.v(LOG_TAG, "onStop received"); 
     forceStopRecorder(); 
    } 

    // General Helpers. 
    private void createRecorder() { 
     recorder = new MyMediaRecorder(); 
    } 

    private void startRecord() { 
     if (recorder.getState() != MyMediaRecorder.PREPARED) { 
      Log.e(LOG_TAG, "Not recordable yet"); 
      return; 
     } 
     recorder.start(); 
     Log.v(LOG_TAG, "Recording started"); 
     recordBut.setText("Stop Record"); 
    } 

    private void stopRecord() { 
     Log.v(LOG_TAG, "Stop of recorder"); 
     if (recorder.getState() == MyMediaRecorder.RECORDING) { 
      recorder.stop(); 
     } 
     recorder.reset(); 
     recordBut.setText("Record"); 
    } 

    private void initiateRecorder(SurfaceHolder holder, int width, int height) { 
     Log.v(LOG_TAG, "H: " + height + " W:" + width); 
     if (recorder.getState() != MyMediaRecorder.INITIAL) { 
      Log.v(LOG_TAG, "Dude - not existing MediaRecorder - quitting"); 
      return; 
     } 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     recorder.setOutputFile(this.filePath); 
     recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     recorder.setVideoSize(width, height); 
     recorder.setVideoFrameRate(24); 
     recorder.setPreviewDisplay(holder.getSurface()); 

     Log.d(LOG_TAG, "Preview restarted"); 
     try { 
      recorder.prepare(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     // isPrepared = true; 
    } 

    private void forceStopRecorder() { 
     Log.v(LOG_TAG, "Force release of recorder"); 
     if (recorder.getState() != MyMediaRecorder.RELEASED) { 
      stopRecord(); 
      recorder.release(); 
     } 
    } 

    private void moveRecordFileToSave() { 
     File source = new File(filePath); 
     File dest = new File(Environment.getExternalStorageDirectory() 
       + DIRECTORY + saveFileName); 
     if (dest.exists()) { 
      Log.v(LOG_TAG, "Delete old save file"); 
      dest.delete(); 
     } 
     source.renameTo(dest); 
    } 

    // ***** Implementing Callback ********/ 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     recordViewHolder = holder; 
     this.width = width; 
     this.height = height; 
     if (recorder.getState() == MyMediaRecorder.RECORDING) { 
      stopRecord(); 
     } 

     if (recorder.getState() == MyMediaRecorder.PREPARED) { 
      recorder.reset(); 
     } 
     initiateRecorder(holder, width, height); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     Log.v(LOG_TAG, "Surface is created: Path to use" + filePath); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     Log.v(LOG_TAG, "Surface is Destroyed"); 
     forceStopRecorder(); 
    } 

} 
+0

嗨..你找到解決方案? – iMDroid

回答

0

首先,檢查你的設備有一個以上的相機:

Camera.getNumberOfCameras(); 

然後,分配一個CAMID值:

camId = Camera.CameraInfo.CAMERA_FACING_BACK; 

camId = Camera.CameraInfo.CAMERA_FACING_FRONT; 

,然後創建一個新的Camera對象訪問特定硬件照相機(CAMID)。

mCamera = Camera.open(camId); 

希望得到這個幫助!

+0

Camera.getNumberOfCameras();上次我在三星S2上試過時返回了「0」。只是說... – Fildor

7

我有一些可能也有幫助,才能跳轉到其他相機,按照此方法:

public void flipit() { 
    //myCamera is the Camera object 
    if (Camera.getNumberOfCameras()>=2) { 
     myCamera.stopPreview(); 
     myCamera.release(); 
     //"which" is just an integer flag 
     switch (which) { 
     case 0: 
      myCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
      which = 1; 
      break; 
     case 1: 
      myCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      which = 0; 
      break; 
     } 
     try { 
      myCamera.setPreviewDisplay(mHolder); 
      //"this" is a SurfaceView which implements SurfaceHolder.Callback, 
      //as found in the code examples 
      myCamera.setPreviewCallback(this); 
      myCamera.startPreview(); 
     } catch (IOException exception) { 
      myCamera.release(); 
      myCamera = null; 
     } 
    } 
} 

現在...的魔術,也不叫從主這種方法線。相反,這種方法已經從一個單獨的線程中拉開序幕,我的代碼做到這一點:

 //btn is a Button that the user clicks on 
    btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //onClick is invoked from main thread 
      //kick-off a different Thread to handle this call 
      Thread t = new Thread() { 
       public void run() { 
        //myViewer is the SurfaceView object which uses 
        //the camera 
        myViewer.flipit(); 
       } 
      }; 
      t.start(); 
     } 
    }); 

我已經在Android 4.1.1測試,所以我認爲它可能爲你工作。 (或直到谷歌決定打破這樣的相機打開/關閉/釋放/解鎖/重新連接/ surfaceholder /的onPause /的onResume的/ etc ..?作品)

+0

是否繼續錄製視頻或在切換攝像機時創建新的視頻文件? – iMDroid

相關問題