2012-03-22 70 views
1

我正在开发一个Android应用程序,借助Android开发人员指南来录制视频。我的程序中的所有代码都与页面相同。但是当我用模拟器运行该程序时,出现如下错误: 。Android视频相机:NullPointerException prepareVideoRecorder

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>  

CameraPreview.java

 /** A basic Camera preview class */ 
    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
     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(VIEW_LOG_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(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage()); 
    } 
} 
} 

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

相机...和模拟器...等待有一个相机不能在模拟器上工作的错误! – WarrenFaith 2012-03-22 13:32:39

+0

但是在使用GoogleAPI模拟器的Android2.1中,它正在工作, – Dharmendra 2012-03-22 13:35:22

+0

您的项目中的哪一行是CameraVideoActivity.java中的第120行? – Tobias 2012-03-22 13:36:00

回答

0

我想你只能得到一次相机实例。并且,因为它已经在使用中,请尝试评论您的代码,如下所示:

private boolean prepareVideoRecorder() { 

    //mCamera = getCameraInstance();