2014-01-29 3 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:

01-30 07: 42: 20,244: D/AndroidRuntime (267): выключение VM

01-30 07: 42: 20,244: Вт/dalvikvm (267): ThreadId = 1: поток, выходящий с неперехваченным исключением (группа = 0x4001d800)

01-30 07: 42: 20,254: Е/AndroidRuntime (267): неустранимая: Главный

01-30 07: 42: 20,254: Е/AndroidRuntime (267): java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.exercise.AndroidVideoCapture/com.exercise.AndroidVideoCapture .AndroidVideoCapture}: java.lang.NullPointerException

01-30 07: 42: 20,254: Е/AndroidRuntime (267): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2663)

01-30 07: 42: 20,254: Е/AndroidRuntime (267): в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679)

01-30 07: 42: 20,254: Е/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)

01-30 07: 42: 20,254: Е/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 (собственный метод)

01-30 07: 42: 20,254: Е/AndroidRuntime (267): в java.lang.reflect.Method.invoke (Method.java:521)

01-30 07: 42: 20,254 : E/AndroidRuntime (267): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.ja ва: 868)

01-30 07: 42: 20,254: Е/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 (родной метод)

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)

01-30 07: 42: 20,254: Е/AndroidRuntime (267): в com.exercise.AndroidVideoCapture.AndroidVideoCapture.onStart (AndroidVideoCapture.java:62)

01-30 07: 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: Е/AndroidRuntime (267): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2636)

01-30 07: 42: 20,254: Е/AndroidRuntime (267): ... 11 подробнее

01-30 07: 42: 23,314 I/Процесс (267): Отправка сигнала. PID: 267 SIG: 9

ответ

0

В вашем методе onStart(), почему вы используете оператор НЕ?

Использовать prepareMediaRecorder() вместо !prepareMediaRecorder().

Вы хотите, чтобы проверить, что prepareMediaRecorder() возвращается TRUE (это означает, что вы готовы к записи), а не «не так» ...

Попробуйте удалить «!»

Надеюсь, что это поможет!

+0

я попытался удалить! но та же проблема – user3247851

+0

1) Я уверен, что вы должны оставить «!» в любом случае 2) Возможно, попробуйте добавить releaseCamera(); перед вашей подготовкойMediaRecorder() в методе onStart() – gilonm

+0

такая же проблема ..... но когда я удаляю метод onstart(), код работает нормально, но с помощью метода onclick(), когда я хочу автоматически записывать видео, когда я запускаю program ..... – user3247851

0

Попробуйте поместить код, чтобы начать запись в OnCreate

Скажите мне, если он работает

+0

Я пытался это сделать, но он дал мне ту же ошибку – user3247851

+0

Пожалуйста, разместите свой логарифм, чтобы я мог помочь вам дальше, в противном случае трудно понять, что вызывает ошибку – JAPK

+0

ijust Добавить мой logcat ..... – user3247851

Смежные вопросы