Android 安卓;不幸的是,它已经停止了;错误

Android 安卓;不幸的是,它已经停止了;错误,android,Android,我是android编程新手。我只想在安卓系统中定制相机。为了做到这一点,我使用了这个网站() 虽然我遵循了网站中的步骤,但还是出现了一个错误“不幸的是,您的应用程序已停止”。我搜索了所有关于“不幸已经停止”的问题,并在这里阅读了答案。但是他们没有帮助我。请帮帮我 这是我的cameraActivity代码: public class CameraActivity extends Activity { protected static final String TAG = null; protec

我是android编程新手。我只想在安卓系统中定制相机。为了做到这一点,我使用了这个网站() 虽然我遵循了网站中的步骤,但还是出现了一个错误“不幸的是,您的应用程序已停止”。我搜索了所有关于“不幸已经停止”的问题,并在这里阅读了答案。但是他们没有帮助我。请帮帮我

这是我的cameraActivity代码:

public class CameraActivity extends Activity {

protected static final String TAG = null;
protected static final String MEDIA_TYPE_IMAGE = ".jpeg";
private static Camera mCamera;
private CameraPreview mPreview;

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

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


    final PictureCallback mPicture = new PictureCallback() {

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

            File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
            if (pictureFile == null){
                Throwable e = null;
                Log.d(TAG, "Error creating media file, check storage permissions: " +
                    e.getMessage());
                return;
            }

            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 File getOutputMediaFile(String mediaTypeImage) {
            // TODO Auto-generated method stub
            return null;
        }
    };

Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // get an image from the camera
            mCamera.takePicture(null, null, mPicture);
        }});}

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
}}
当我单击logcat中的error时,它显示了以下内容 "mcamera.setPreviewDisplay(holder);" 在LogCat中

E/AndroidRuntime(1071):致命异常:主 E/AndroidRuntime(1071):java.lang.NullPointerException E/AndroidRuntime(1071):位于com.example.ntry.CameraPreview.surfaceCreated(CameraPreview.java:32) E/AndroidRuntime(1071):位于android.view.SurfaceView.updateWidow(SurfaceView.java:569) E/AndroidRuntime(1071):在android.view.SurfaceView.access$000(SurfaceView.java:86) E/AndroidRuntime(1071):在android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174) E/AndroidRuntime(1071):位于android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:680) E/AndroidRuntime(1071):位于android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1842) E/AndroidRuntime(1071):位于android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) E/AndroidRuntime(1071):位于android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) E/AndroidRuntime(1071):在android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) E/AndroidRuntime(1071):在android.view.Choreographer.doCallbacks(Choreographer.java:562) E/AndroidRuntime(1071):在android.view.Choreographer.doFrame(Choreographer.java:532) E/AndroidRuntime(1071):在android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) E/AndroidRuntime(1071):位于android.os.Handler.handleCallback(Handler.java:725) E/AndroidRuntime(1071):位于android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(1071):位于android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(1071):位于android.app.ActivityThread.main(ActivityThread.java:5041) E/AndroidRuntime(1071):位于java.lang.reflect.Method.Invokenactive(本机方法) E/AndroidRuntime(1071):位于java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(1071):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) E/AndroidRuntime(1071):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) E/AndroidRuntime(1071):位于dalvik.system.NativeStart.main(本机方法)

如果在应用程序首次启动时发生,则相机对象为空或支架为空

但是,如果在第二次导航到摄影机视图时发生这种情况,则摄影机将保留在上一个视图中,并且第二次无法访问,则必须在暂停视图或销毁视图时释放摄影机


希望它能有所帮助

从这里看,
getCameraInstance
返回空值。是不是
Camera.open()
引发了一个异常?

第32行CameraPreview是什么?@Raghunandan在第32行-->“mcamera.setPreviewDisplay(holder);”如果你想要一个好的摄像头代码示例,看看大学生完成的这个项目,没有关于Camera.open()的异常。你的
mcamera
看起来是空的,这是通过查看代码实现的一种方法。另一个是,
.open()
返回null而不引发NPE。叹气,你告诉我们(但不要真的这么说,我只是打个比方)。对防御进行
null
检查。找出
.open()
为什么以及如何返回null。你的意思是“如果(c!=null)这样做”?对不起,我不知道。。如果我知道的话,我不会问这样的问题。我没有要求你教我,但也许你能让我明白一点……我不明白。你的意思是摄像头c=null有问题?你是从第一次应用程序rns中得到这个崩溃吗?是的,我的应用程序第一次运行时就崩溃了。
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {


private SurfaceHolder mHolder;
private Camera mcamera;

public CameraPreview(Context context,Camera camera){
    super(context);
    mcamera=camera;
    mHolder=getHolder();
    mHolder.addCallback(this);
    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());
    }
}
E/AndroidRuntime(1071): FATAL EXCEPTION: main E/AndroidRuntime(1071): java.lang.NullPointerException E/AndroidRuntime(1071): at com.example.ntry.CameraPreview.surfaceCreated(CameraPreview.java:32) E/AndroidRuntime(1071): at android.view.SurfaceView.updateWindow(SurfaceView.java:569) E/AndroidRuntime(1071): at android.view.SurfaceView.access$000(SurfaceView.java:86) E/AndroidRuntime(1071): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174) E/AndroidRuntime(1071): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:680) E/AndroidRuntime(1071): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1842) E/AndroidRuntime(1071): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) E/AndroidRuntime(1071): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) E/AndroidRuntime(1071): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) E/AndroidRuntime(1071): at android.view.Choreographer.doCallbacks(Choreographer.java:562) E/AndroidRuntime(1071): at android.view.Choreographer.doFrame(Choreographer.java:532) E/AndroidRuntime(1071): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) E/AndroidRuntime(1071): at android.os.Handler.handleCallback(Handler.java:725) E/AndroidRuntime(1071): at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(1071): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(1071): at android.app.ActivityThread.main(ActivityThread.java:5041) E/AndroidRuntime(1071): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(1071): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(1071): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) E/AndroidRuntime(1071): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) E/AndroidRuntime(1071): at dalvik.system.NativeStart.main(Native Method)