2014-06-07 3 views
0

스마트 폰 카메라를 통해 동영상을 녹화하는 앱을 작성하고 싶습니다. 이 웹 사이트에서 도움을 받으 셨습니다 : http://developer.android.com/guide/topics/media/camera.html#custom-cameraAndroid 카메라 unlock mediarecorder

메신저 시작하려면 해당 소스 코드를 사용하십시오.

주요 활동 :

public class MainActivity extends Activity { 

     protected static final String TAG = null; 
     private Camera mCamera; 
     private CameraPreview mPreview; 
     private MediaRecorder mMediaRecorder=null; 
     public static final int MEDIA_TYPE_IMAGE = 1; 
     public static final int MEDIA_TYPE_VIDEO = 2; 
     private boolean isRecording = false; 


     /** A safe way to get an instance of the Camera object. */ 
     public static Camera getCameraInstance(){ 
      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 
     } 

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

      // Create an instance of Camera 
      mCamera = getCameraInstance(); 

      // Create our Preview view and set it as the content of our activity. 
      mPreview = new CameraPreview(this, mCamera); 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
      preview.addView(mPreview); 


     // Add a listener to the Capture button 
     final Button 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"); 
         //setCaptureButtonText("Capture"); 
         isRecording = false; 
        } else { 
         // initialize video camera 
         if (prepareVideoRecorder()) { 
          // 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"); 
          //setCaptureButtonText("Stop"); 
          isRecording = true; 
         } else { 
          // prepare didn't work, release the camera 
          releaseMediaRecorder(); 
          // inform user 
         } 
        } 
       } 
      } 
     ); 
     } 

     @SuppressLint("NewApi") private boolean prepareVideoRecorder(){ 

      mCamera = getCameraInstance(); 
      Log.d(TAG, "mcamera object: " + mCamera.getNumberOfCameras()); 
      mMediaRecorder = new MediaRecorder(); 

      // Step 1: Unlock and set camera to MediaRecorder 
      try{ 
      mCamera.unlock(); 
      }catch (RuntimeException r){ 
     Log.d(TAG, "mcamera unlock: " + r.getMessage()); 
      } 
      mMediaRecorder.setCamera(mCamera); 

      // Step 2: Set sources 
      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      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 
      mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

      // 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.release();  // release the camera for other applications 
       mCamera = null; 
      } 
     } 

     /** 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. 

      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; 
     } 

    } 

카메라 미리보기 클래스 :

/** A basic Camera preview class */ 
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    private static final String TAG = "Preview"; 

    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. 
    } 

    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 
     } 

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

하지만 난 내 삼성 S5660 API 2.3.3에 응용 프로그램을 실행할 때이 오류가 발생합니다 :

06-07 19:55:48.859: D/(20274): mcamera object: 1 
06-07 21:10:19.159: D/(20465): mcamera unlock: null 
06-07 19:55:48.859: W/dalvikvm(20274): threadid=1: thread exiting with uncaught exception (group=0x40018578) 
06-07 19:55:48.859: E/AndroidRuntime(20274): FATAL EXCEPTION: main 
06-07 19:55:48.859: E/AndroidRuntime(20274): java.lang.NullPointerException 
06-07 19:55:48.859: E/AndroidRuntime(20274): at com.example.videocapture.MainActivity.prepareVideoRecorder(MainActivity.java:118) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at com.example.videocapture.MainActivity.access$5(MainActivity.java:111) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at com.example.videocapture.MainActivity$1.onClick(MainActivity.java:91) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.view.View.performClick(View.java:2485) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.view.View$PerformClick.run(View.java:9080) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.os.Handler.handleCallback(Handler.java:587) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.os.Looper.loop(Looper.java:130) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at android.app.ActivityThread.main(ActivityThread.java:3687) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at java.lang.reflect.Method.invokeNative(Native Method) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at java.lang.reflect.Method.invoke(Method.java:507) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
06-07 19:55:48.859: E/AndroidRuntime(20274): at dalvik.system.NativeStart.main(Native Method) 

널 포인터 예외에 린 118 prepareVideoRecorder()에 있습니다 :

// Step 1: Unlock and set camera to MediaRecorder 
     mCamera.unlock(); 

앱은 카메라가 표시됩니다 시작하고 난 버튼 "캡처"를 명중 할 때이 오류가 발생하는 경우. 이제 문제가 "mCamera = getCameraInstance();"라고 생각합니다. 이 함수에서 다시 호출되고 첫 번째 카메라 미리보기 클래스의 주 활동에서 만들어졌습니다.

"mCamera = getCameraInstance();"다음에 log 태그를 추가했습니다. prepareVideoRecorder()에서 실제로 null인지 확인하지만 "06-07 19 : 55 : 48.859 : D/(20274) : mcamera 객체 : 1"

+0

동일한 코드 기반, 동일한 예외 : http://hashcode.ru/questions/185356/android-camera-nullpointerexception. 어쩌면 그 대답도 같은 것입니까? * try ... catch *에서'mCamera.unlock()'을 랩핑하십시오. –

+0

로그에서 numberOfCameras가 1인지 확인합니다. mCamera 객체는 검사하지 않습니다. –

+0

그 부분을 try 및 catch 블록으로 변경했으며 logtag에 런타임 예외가 표시되고 mCamera가 null입니다. –

답변

1

해결 방법은 mCamera = getCameraInstance() 라인을 제거하는 것입니다. prepareVideoRecorder() 함수에서.

0

mMediaRecorder is null이 표시되는 것을 확인하면 올바르게 초기화해야합니다. 그것.
here을 확인하십시오.

+0

고마워하지만 그 didnt는 발사 후 nullpointer excep를 잡아라. at // Step 1 : 카메라를 MediaRecorder 잠금 해제하고 설정하십시오. mCamera.unlock(); –

+0

@future_freelancer 'mMediaRecorder == null'은 해결책이 아니라 사실이었습니다. onCreate 메서드에서 mMediaRecorder를 초기화합니다. –

관련 문제