Android摄像机:NullPointerException prepareVideoRecorder

Android摄像机:NullPointerException prepareVideoRecorder,android,exception,camera,Android,Exception,Camera,我正在开发一个Android应用程序,在Android开发者指南的帮助下录制视频。我的程序上的所有代码都与页面上的代码相同。但当我用emulator运行程序时, 错误如下 03-22 12:32:27.093: D/AndroidRuntime(336): Shutting down VM 03-22 12:32:27.093: W/dalvikvm(336): threadid=1: thread exiting with uncaught exception (group=0x4001556

我正在开发一个Android应用程序,在Android开发者指南的帮助下录制视频。我的程序上的所有代码都与页面上的代码相同。但当我用emulator运行程序时, 错误如下

03-22 12:32:27.093: D/AndroidRuntime(336): Shutting down VM
03-22 12:32:27.093: W/dalvikvm(336): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-22 12:32:27.103: E/AndroidRuntime(336): FATAL EXCEPTION: main
03-22 12:32:27.103: E/AndroidRuntime(336): java.lang.NullPointerException
03-22 12:32:27.103: E/AndroidRuntime(336): at com.camerademo.CameraVideoActivity.prepareVideoRecorder(CameraVideoActivity.java:120)
03-22 12:32:27.103: E/AndroidRuntime(336): at com.camerademo.CameraVideoActivity.access$5(CameraVideoActivity.java:114)
03-22 12:32:27.103: E/AndroidRuntime(336): at com.camerademo.CameraVideoActivity$1.onClick(CameraVideoActivity.java:72)
......
manifest.xml如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.camerademo"
         android:versionCode="1"
         android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="9" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.camera"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".CameraVideoActivity"
            android:label="@string/app_name" 
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>     
CameraVideoActivity.java

    public class CameraVideoActivity extends Activity{
        private Camera mCamera;
        private CameraPreview mPreview;
    private MediaRecorder mMediaRecorder;
    private boolean isRecording = false;

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

    // Create an instance of Camera
    if (checkCameraHardware(this)) {
        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);

    final Button captureButton = (Button) findViewById(R.id.button_capture);
     // Add a listener to the Capture button
     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
                     mCamera.lock();         // take camera access back from MediaRecorder

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

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

private boolean prepareVideoRecorder(){

    mCamera = getCameraInstance();
    mMediaRecorder = new MediaRecorder();

    // 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
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(ALARM_SERVICE, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(ALARM_SERVICE, "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;
    }
}    

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/** Create a file Uri for saving an image or video */
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;
}
}

我想你只能得到一个相机实例一次。由于它已经在使用中,请尝试这样评论您的代码:

    private boolean prepareVideoRecorder() {

    //mCamera = getCameraInstance();

照相机。。。和模拟器。。。等等,有一个错误,摄像头在模拟器上不工作!但在使用GoogleAPI emulator的Android2.1中,它正在工作,项目中的哪一行是CameraVideoActivity.java中的第120行?它是
mCamera.unlock()@Tobiaso有什么方法可以在模拟器上调试涉及摄像头的程序吗?@WarrenFaith
    private boolean prepareVideoRecorder() {

    //mCamera = getCameraInstance();