2012-09-14 100 views
0
捕獲圖像

我開發一個應用程序,我需要有固定的相機我的應用程序 所以,我有兩件事情在這裏實現, 1.捕獲圖像 2.記錄內部運行視頻錄製視頻和Android的

我有困難,錄製視頻和停止,復位相機

以下是我的代碼片段: -

import java.io.File; 
import java.io.IOException; 
import java.util.Date; 
import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.media.MediaRecorder; 
import android.media.MediaRecorder.OnInfoListener; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.MenuItem; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.Menu; 
import android.view.SurfaceView; 
import android.widget.Toast; 

public class Myvideo1 extends Activity implements SurfaceHolder.Callback { 

    @Override 
    protected void onDestroy() { 
    // stopRecording(); 
     super.onDestroy(); 
    } 

    private SurfaceHolder surfaceHolder; 
    private SurfaceView surfaceView; 
    public MediaRecorder mrec = new MediaRecorder();  
    private Camera mCamera; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     surfaceView = (SurfaceView) findViewById(R.id.videoview); 
    //  if(mCamera==null) 
    //  mCamera = Camera.open(); 

     // Please maintain sequence of following code. 

     // If you change sequence it will not work. 

     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     try { 
      startRecording(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 

     menu.add(0, 0, 0, "Start"); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) 

    { 
     if(item.getTitle().equals("Start")) 
     { 
      try { 

       startRecording(); 
      // item.setTitle("Stop"); 

      } catch (Exception e) { 

       String message = e.getMessage(); 
       Log.i(null, "Problem " + message); 
       mrec.release(); 
      } 
     } 

     else 
     // if(item.getTitle().equals("Stop")) 
     { 
      // mrec.stop(); 
     // mrec.release(); 
     // mrec = null; 
      // item.setTitle("Start"); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    protected void startRecording() throws IOException 
    { 
     if(mCamera==null) 
      mCamera = Camera.open(); 

     String filename; 
     String path; 

     path= Environment.getExternalStorageDirectory().getAbsolutePath().toString(); 

     Date date=new Date(); 
     filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4"; 

     //create empty file it must use 
     File file=new File(path,filename); 

     mrec = new MediaRecorder(); 

     mCamera.lock(); 
     mCamera.unlock(); 

     // Please maintain sequence of following code. 

     // If you change sequence it will not work. 
     mrec.setCamera(mCamera);  
     mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mrec.setAudioSource(MediaRecorder.AudioSource.MIC);  
     mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mrec.setPreviewDisplay(surfaceHolder.getSurface()); 
     mrec.setOutputFile(path+filename); 
     mrec.setMaxDuration(10000);  //10 sec 



    // } 


    mrec.setOnInfoListener(new OnInfoListener() { 
     @Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
      if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) { 
       onStop();  

       Toast.makeText(getApplicationContext(), "video of 10 sec is completed", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    } 
    ); 

    } 


    public void preparerec() 
    { 
     try { 
      mrec.prepare(); 
      mCamera.setPreviewDisplay(this.surfaceHolder); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    public void startrec() 
    { 
     mrec.start(); 
    } 





    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {  

     Camera.Parameters parameters = mCamera.getParameters();  
     parameters.setPreviewSize(width, height);  
     mCamera.setParameters(parameters);  
     mCamera.startPreview(); 


    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) {  

     /* if (mCamera != null) { 
      Parameters params = mCamera.getParameters(); 
      mCamera.setParameters(params); 

      Log.i("Surface", "Created"); 
     } 
     else { 
      Toast.makeText(getApplicationContext(), "Camera not available!", 
        Toast.LENGTH_LONG).show(); 

      finish(); 
     }*/ 


     try     {  
      //Open the Camera in preview mode    
      mCamera = Camera.open(); 
      preparerec(); 
      //   
      }    
     catch(Exception ioe)   
      {   
      ioe.printStackTrace(System.out);   
      } 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mCamera.release();  

    } 


    public void onStop(){ 
     mrec.stop(); 
     mrec.release(); 
     mrec = null; 
    // item.setTitle("Start"); 
    } 


} 

當我的startRecording屏幕閃爍獲取和綠色在我三星Galaxy S2的任何解決方案?

+0

你有什麼異常/錯誤嗎? –

+0

當我開始錄製屏幕變得模糊這個任何解決方案? – kendrelaxman

回答

0

This Solution適合我。

+0

「此解決方案」不再是有效的鏈接。 – Yar

+0

請修復此鏈接。它被打破。 –

0

您正在onCreate(在startRecording - 將始終運行在surfaceCreated之前),然後在surfaceCreated中創建一個攝像頭對象。只打開一次相機;第二次會拋出異常。

我建議在用戶點擊按鈕時將您的錄製代碼移動到所有運行狀態;你已經將設置工作分爲2-3個方法,這些方法都是在不同的時間觸發的,並且你假定它們被調用的順序相當多。

如果您需要在應用程序啓動時立即開始錄製,我建議每次回調檢查是否所有其他人都已完成,然後開始錄製。