2013-08-12 1 views
1

비디오 레코더 사용에 대한 Google 자습서를 가지고 놀고 있지만 어쨌든 작동하지 않습니다. 먼저 release 오류 이후에 호출 된 Method에서 계속 진행합니다. 카메라 미리보기에서 startPreview가 onSurfaceChanged()가 다시 호출되기 전에 mCamera.stoppreview()가 작동하지 않는다는 것을 알기 위해 추적했습니다. 또한 mediaserver에서 Camera 100 오류가 발생하여 Camera Server가 중지되고 MediaRecorder.start()가 호출 될 때 icamera가 중단되었습니다. 나는 이유를 알 수없는 것 같습니다. 여기 카메라 오류 받기 100 및 릴리스 이후에 호출 된 메서드

내 CameraActivity 코드

public class MainActivity extends Activity { 
    private Camera mCamera; 
    private MediaRecorder mMediaRecorder; 
    private CameraPreview mPreview; 
    private static final String TAG = "Message"; 
    public static final int MEDIA_TYPE_IMAGE = 1; 
    public static final int MEDIA_TYPE_VIDEO = 2; 
    private boolean isRecording = false; 
    Button captureButton; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      setContentView(R.layout.preview); 
      System.out.println("Going to get the camera"); 


      mCamera = getCameraInstance(); 
      //mMediaRecorder = new MediaRecorder(); 
      mPreview = new CameraPreview(this, mCamera); 

      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 

      preview.addView(mPreview); 
      // setPreviewCallback(null); 

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

         if (isRecording) { 
           // stop recording and release camera 
           mMediaRecorder.stop(); // stop the recording 
           releaseMediaRecorder(); // release the MediaRecorder object 
           mCamera.lock();   // take camera access back from MediaRecorder 

           // inform the user that recording has stopped 
           captureButton.setText("Capture"); 
           isRecording = false; 
          } else { 
           // initialize video camera 
           releaseCamera(); 

           if (prepareVideoRecorder()) { 
            System.out.println("Starting to record"); 
            // Camera is available and unlocked, MediaRecorder is prepared, 
            // now you can start recording 
            mMediaRecorder.start(); 

            // inform the user that recording has started 
            captureButton.setText("Stop"); 
            isRecording = true; 
           } else { 
            // prepare didn't work, release the camera 
            System.out.println("Recording failed"); 
            releaseMediaRecorder(); 
            // inform user 
           } 
          } 
         } 

       } 
      ); 
    } 
    public static Camera getCameraInstance(){ 
     Camera c = null; 
     try { 
      c = Camera.open(); 
      System.out.println("This is the camera "+c);// attempt to get a Camera instance 
     } 
     catch (Exception e){ 
      // Camera is not available (in use or does not exist) 
      System.out.println("Didn't get the camera "); 
     } 
     return c; // returns null if camera is unavailable 
    } 

    private boolean prepareVideoRecorder(){ 
     mCamera = getCameraInstance(); 
     mMediaRecorder = new MediaRecorder(); 
     /*CameraPreview preview; 
     preview=new CameraPreview(this, mCamera);*/ 
     // Step 1: Unlock and set camera to MediaRecorder 
     mCamera.unlock(); 
     mMediaRecorder.setCamera(mCamera); 

     // Step 2: Set sources 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

     // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
     mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

     // Step 4: Set output file 
     mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 

     // Step 5: Set the preview output 
     System.out.println("About to preview"); 
     mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 
     System.out.println("Preview worked"); 
     // Step 6: Prepare configured MediaRecorder 
     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
      return false; 
     } catch (IOException e) { 
      Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 
      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 (mMediaRecorder != null) { 
      mMediaRecorder.reset(); // clear recorder configuration 
      mMediaRecorder.release(); // release the recorder object 
      mMediaRecorder = null; 
      mCamera.lock();   // lock camera for later use 
     } 
    } 

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

    private PictureCallback mPicture = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      System.out.println("Picture received"); 
      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
      if (pictureFile == null){ 
       Log.d(TAG, "Error creating media file, check storage permissions: "); 
       return; 
      } 

      try { 
       System.out.println("Saving"); 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 
       Log.d(TAG, "File not found: " + e.getMessage()); 
      } catch (IOException e) { 
       Log.d(TAG, "Error accessing file: " + e.getMessage()); 
      } 
     } 
    }; 



    /** Create a File for saving an image or video */ 
    /** Create a File for saving an image or video */ 
    private static File getOutputMediaFile(int type){ 
     // To be safe, you should check that the SDCard is mounted 
     // using Environment.getExternalStorageState() before doing this. 
     System.out.println("Trying to save picture"); 
     File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
     // This location works best if you want the created images to be shared 
     // between applications and persist after your app has been uninstalled. 

     // Create the storage directory if it does not exist 
     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       Log.d("MyCameraApp", "failed to create directory"); 
       return null; 
      } 
     } 

     // Create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     File mediaFile; 
     if (type == MEDIA_TYPE_IMAGE){ 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
      "IMG_"+ timeStamp + ".jpg"); 
     } else if(type == MEDIA_TYPE_VIDEO) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
      "VID_"+ timeStamp + ".mp4"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 
} 

이며,이 내 CameraPreview 클래스

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Message"; 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(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); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
     /*mCamera.setPreviewCallback(null); 
     mCamera.stopPreview(); 
     mCamera.release();*/ 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // 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 
      System.out.println("Stop preview didn't work "); 


     } 

     // set preview size and make any resize, rotate or 
     // reformatting changes here 

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

     } catch (Exception e){ 
      Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
     } 
    } 
} 

편집이다 : 나는 또한이 문제를 해결할 수 있었다 XML 레이아웃

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <FrameLayout 
    android:id="@+id/camera_preview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 

    <Button 
    android:id="@+id/button_capture" 
    android:text="Capture" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    /> 
</LinearLayout> 
+0

우선 'FrameLayout preview = (FrameLayout) findViewById (R.id.camera_preview)'가 가장 효과적입니다. SurfaceView를 FrameLayout으로 형 변환 할 수 없습니다. –

+0

이 줄을 제거해보십시오 // 비디오 카메라를 초기화하십시오 releaseCamera(); if (isRecording) – Tobiel

+0

@mirco.widmer의 다른 부분에 있습니다. 카메라 응용 프로그램을 만들었을 때 잘 작동했습니다. –

답변

0

onPause()에서 mCamera.release()에 대한 호출을 제거합니다. 다음은 몇 가지 코드입니다.

//kv Only call release here if we're running an OS later than Gingerbread, otherwise, camera will freeze 
if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) 
{ 
    mCamera.release(); 
} 
관련 문제