2014-01-29 58 views
1

這是我的代碼,我試圖記錄視頻,當我打開應用程序,但它給了我錯誤,當我試圖打開應用程序....... 使用按鈕記錄視頻沒有問題,但是當我添加(啓動)方法時開始 給我的錯誤....如何在打開應用程序時自動錄製視頻?

private Camera myCamera; 
private MyCameraSurfaceView myCameraSurfaceView; 
private MediaRecorder mediaRecorder; 

Button myButton; 
SurfaceHolder surfaceHolder; 
boolean recording; 

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

    recording = false; 

    setContentView(R.layout.main); 

    //Get Camera for preview 
    myCamera = getCameraInstance(); 
    if(myCamera == null){ 
     Toast.makeText(AndroidVideoCapture.this, 
       "Fail to get Camera", 
       Toast.LENGTH_LONG).show(); 
    } 

    myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera); 
    FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview); 
    myCameraPreview.addView(myCameraSurfaceView); 

    myButton = (Button)findViewById(R.id.mybutton); 
    myButton.setOnClickListener(myButtonOnClickListener); 



} 


@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 

     if(!prepareMediaRecorder()){ 
     mediaRecorder.start(); 
} 
} 


Button.OnClickListener myButtonOnClickListener 
= new Button.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(recording){ 
      // stop recording and release camera 
      mediaRecorder.stop(); // stop the recording 
      releaseMediaRecorder(); // release the MediaRecorder object 

      //Exit after saved 
      finish(); 
     }else{ 

      //Release Camera before MediaRecorder start 
      releaseCamera(); 

      if(!prepareMediaRecorder()){ 
       Toast.makeText(AndroidVideoCapture.this, 
         "Fail in prepareMediaRecorder()!\n - Ended -", 
         Toast.LENGTH_LONG).show(); 
       finish(); 
      } 

      mediaRecorder.start(); 
      recording = true; 
      myButton.setText("STOP"); 
     } 
    }}; 

private Camera getCameraInstance(){ 
    // TODO Auto-generated method stub 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

private boolean prepareMediaRecorder(){ 
    myCamera = getCameraInstance(); 
    mediaRecorder = new MediaRecorder(); 

    myCamera.unlock(); 
    mediaRecorder.setCamera(myCamera); 

    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

    mediaRecorder.setOutputFile("/sdcard/myvideo.mp4"); 
    mediaRecorder.setMaxDuration(6000); // Set max duration 60 sec. 
    mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M 

    mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface()); 

    try { 
     mediaRecorder.prepare(); 

    } catch (IllegalStateException e) { 
     releaseMediaRecorder(); 
     return false; 
    } catch (IOException e) { 
     releaseMediaRecorder(); 
     return false; 
    } 
    return true; 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    releaseMediaRecorder();  // if you are using MediaRecorder, release it first 
    releaseCamera();    // release the camera immediately on pause event 
} 

private void releaseMediaRecorder(){ 
    if (mediaRecorder != null) { 
     mediaRecorder.reset(); // clear recorder configuration 
     mediaRecorder.release(); // release the recorder object 
     mediaRecorder = null; 
     myCamera.lock();   // lock camera for later use 
    } 
} 

private void releaseCamera(){ 
    if (myCamera != null){ 
     myCamera.release();  // release the camera for other applications 
     myCamera = null; 
    } 
} 









public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ 

    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public MyCameraSurfaceView(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int weight, 
      int height) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 

     // make any resize, rotate or reformatting changes here 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
     } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
} 

}

,這是我的logcat:

7月1日至30日:42:20.244: D/AndroidRuntime(267):關閉VM

01-30 07:42:20.244:W/dalvikvm(267):threadid = 1:線程以未捕獲的異常退出(group = 0x4001d800)

01-30 07:42:20.254:E/AndroidRuntime ):致命異常:主

7月1日至30日:42:20.254:E/AndroidRuntime(267):了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.exercise.AndroidVideoCapture/com.exercise.AndroidVideoCapture .AndroidVideoCapture}:顯示java.lang.NullPointerException

7月1日至30日:42:20.254:E/AndroidRuntime(267):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)

7月1日至三十○日:42:20.254:E/AndroidRuntime(267):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)

7月1日至三十○日:42:20.254:E/AndroidRuntime (267):at android.app.ActivityThread.access $ 2300(ActivityThread.java:125)

01-30 07:42:20.254:E/AndroidRuntime(267):at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033)

7月1日至30日:42:20.254:E/AndroidRuntime(267):在android.os.Handler.dispatchMessage(Handler.java:99)

01-30 07:42:20.254:E/AndroidRuntime(267):at android.os.Looper.loop(Looper.java:123)

01-30 07:42:20.254:E/AndroidRuntime(267) ):at android.app.ActivityThread.main(ActivityThread.java:4627)

01-30 07:42:20.254:E/AndroidRuntime(267):at java.lang.reflect.Method.invokeNative(Native Method )

7月1日至30日:42:20.254:E/AndroidRuntime(267):在java.lang.reflect.Method.invoke(Method.java:521)

7月1日至30日:42:20.254 :E/AndroidRuntime(267):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.ja VA:868)

01-30 07:42:20.254:E/AndroidRuntime(267):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

01-30 07/42:20.254:E/AndroidRuntime(267):at dalvik.system.NativeStart.main(Native Method)

01-30 07:42:20.254:E/AndroidRuntime(267):引起:java。 lang.NullPointerException

01-30 07:42:20.254:E/AndroidRuntime(267):at com.exercise.AndroidVideoCapture.AndroidVideoCapture.prepareMediaRecorder(AndroidVideoCapture。的java:115)

7月1日至30日:42:20.254:E/AndroidRuntime(267):在com.exercise.AndroidVideoCapture.AndroidVideoCapture.onStart(AndroidVideoCapture.java:62)

7月1日至30日: 42:20.254:E/AndroidRuntime(267):at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)

01-30 07:42:20.254:E/AndroidRuntime(267):at android.app .Activity.performStart(Activity.java:3781)

01-30 07:42:20.254:E/AndroidRuntime(267):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)

7月1日至30日:42:20.254:E/AndroidRuntime(267):... 11更

7月1日至30日:42:23.314:I /方法(267):發送信號。 PID:267 SIG:9

回答

0

在你onStart()方法,你爲什麼要使用NOT操作?

使用prepareMediaRecorder()而不是!prepareMediaRecorder()

你要檢查prepareMediaRecorder()返回TRUE(這意味着你已經準備好記錄),而不是「不是真的」 ......

嘗試刪除「!」

希望這有助於!

+0

我試圖刪除!但同樣的問題 – user3247851

+0

1)我相信你應該忽略「!」無論如何 2)也許嘗試添加releaseCamera();在你的prepareMediaRecorder()onStart()方法 – gilonm

+0

同樣的問題之前.....但是當我刪除onstart()方法的代碼工作正常,但使用onclick()方法,而我想自動錄製視頻時,我運行程序..... – user3247851

0

嘗試把代碼開始在OnCreate中

記錄

告訴我,如果它的工作原理

+0

我試圖做到這一點,但它給了我相同的錯誤 – user3247851

+0

請張貼您的logcat,以便我可以進一步幫助您,否則很難知道是什麼原因造成的錯誤 – JAPK

+0

ijust添加我的logcat ..... – user3247851

相關問題