Java 自定义摄像头崩溃应用程序onLanuch

Java 自定义摄像头崩溃应用程序onLanuch,java,android,camera,surfaceview,android-logcat,Java,Android,Camera,Surfaceview,Android Logcat,我是一个Android新手,正在尝试实现一个定制的摄像头应用程序 我遵循了这个原则: 但每次我尝试启动应用程序时,它都会崩溃 我的代码发布在下面: 主要活动 import android.app.Activity; import android.hardware.Camera; import android.os.Bundle; import android.view.Menu; import android.widget.FrameLay

我是一个Android新手,正在尝试实现一个定制的摄像头应用程序

我遵循了这个原则:

但每次我尝试启动应用程序时,它都会崩溃

我的代码发布在下面:

主要活动

      import android.app.Activity;
      import android.hardware.Camera;
     import android.os.Bundle;
     import android.view.Menu;
     import android.widget.FrameLayout;

  public class MainActivity extends Activity {
  private Camera mCamera;
   private CameraPreview mPreview;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    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);
}

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 boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}
摄影评论课

    package com.studio9ja.smileycamera;
   import java.io.IOException;

   import android.content.Context;
   import android.hardware.Camera;
    import android.util.Log;
   import android.view.SurfaceHolder;
   import android.view.SurfaceView;
   import android.widget.Toast;



  public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
private String TAG;

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());
    }
}
}        
main_activity.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>
我还向manifest.xml添加了以下权限

      <uses-permission android:name="android.permission.CAMERA" />
      <uses-feature android:name="android.hardware.camera" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


任何帮助都将不胜感激,谢谢你的相机可能是空的。如果只有一个异常可供查看,则应打印该异常,并记录以确保相机仍不为空:

/** 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){
        e.printstacktrace();

    }
    return c; // returns null if camera is unavailable
}
然后在调用preview之前检查并确保其不为null:

if(mCamera!=null){
mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);
}
if(mCamera!=null){
mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);
}