2012-10-29 138 views
4

我已经编写了此代码以在屏幕上的Surfaceview上打开前置摄像头,但是当您单击按钮时,我想用前置摄像头拍摄视频。在SurfaceView上打开默认相机并使用前置摄像头拍摄

此代码崩溃。我已经使用了两种不同的可变的摄像头,但我不找不到我的错误:(..我也跟着谷歌引导

public class MainActivity extends Activity { 
    public static final int MEDIA_TYPE_VIDEO = 2; 

    private Camera mCamera; 
    private CameraPreview mPreview; 
    public static final int MEDIA_TYPE_IMAGE = 1; 
    protected static final String TAG = null; 

    private MediaRecorder mMediaRecorder; 
    private Camera mCamerafront; 
    private boolean isRecording = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // Button captureButton = (Button) findViewById(id.button_capture); 
     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 
     Button captureButton = (Button) findViewById(id.button_capture); 
     captureButton.setOnClickListener(
       new View.OnClickListener() { 

        public void onClick(View v) { 
         if (isRecording) { 
          // stop recording and release camera 
          mMediaRecorder.stop(); // stop the recording 
          releaseMediaRecorder(); // release the MediaRecorder object 
          mCamerafront.lock();   // take camera access back from MediaRecorder 

          // inform the user that recording has stopped 
          //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 
           //setCaptureButtonText("Stop"); 
           isRecording = true; 
          } else { 
           // prepare didn't work, release the camera 
           releaseMediaRecorder(); 
           // inform user 
          } 
         } 
        } 
       } 
       ); 

     /* captureButton.setOnClickListener(
       new View.OnClickListener() { 
        public void onClick(View v) { 
         // get an image from the camera 
         mCamera.takePicture(null, null, mPicture); 
        } 
       } 
      );*/ 
    } 



    //*PARTE registrazione 
    private boolean prepareVideoRecorder(){ 
     int cameraCount = Camera.getNumberOfCameras()-1; 
     mCamerafront=Camera.open(cameraCount); 


     mMediaRecorder = new MediaRecorder(); 
     mCamerafront.unlock(); 
     mMediaRecorder.setCamera(mCamerafront); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 
     mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 

     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; 

    } 

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

    /** Check if this device has a camera */ 
    private boolean checkCameraHardware(Context context) { 
     if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
      // this device has a camera 
      return true; 
     } else { 
      // no camera on this device 
      return 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 
    } 


    /** A basic Camera preview class */ 
    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
     private final String TAG = null; 
     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. 
     } 

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

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



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







    private PictureCallback mPicture = new PictureCallback() { 


     public void onPictureTaken(byte[] data, Camera camera) { 

      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 


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


    private static Uri getOutputMediaFileUri(int type){ 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

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







    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 
+1

在logcat中的任何错误跟踪? – fiddler

+0

这是我的logcat – Crowley91t

+0

http://pastebin.com/tW89bjYS – Crowley91t

回答

0

您需要添加下列权限在YOUT的AndroidManifest.xml文件。

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
+0

此权限不会使我的应用程序崩溃。现在应用程序创建一个文件视频,但这是腐败的,我可以'看到视频。 – Crowley91t

相关问题