Android 将摄像头从后向前切换显示在release()之后调用的java.lang.runtimeexception方法

Android 将摄像头从后向前切换显示在release()之后调用的java.lang.runtimeexception方法,android,android-camera,surfaceview,surfaceholder,Android,Android Camera,Surfaceview,Surfaceholder,我正在开发自己的Android摄像头应用程序。我想做的是,当我打开我的应用程序时,它必须显示两个按钮,可能是捕获和拍照,以及摄像头屏幕。当我单击捕获按钮时,我可以拍摄当前位置的图像(从后面的摄像头)。拍摄完这张照片后,如果我单击拍照按钮,我想从前置摄像头拍摄照片,但它显示了发布后调用的java.lang.runtimeexception方法()。这里我附加了我的代码。因此,任何人都请帮助我解决错误 MainActivity.java package com.example.camera1; im

我正在开发自己的Android摄像头应用程序。我想做的是,当我打开我的应用程序时,它必须显示两个按钮,可能是捕获拍照,以及摄像头屏幕。当我单击捕获按钮时,我可以拍摄当前位置的图像(从后面的摄像头)。拍摄完这张照片后,如果我单击拍照按钮,我想从前置摄像头拍摄照片,但它显示了发布后调用的
java.lang.runtimeexception方法()
。这里我附加了我的代码。因此,任何人都请帮助我解决错误

MainActivity.java

package com.example.camera1;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

       private Camera cameraObject;
       private ShowCamera showCamera;
       private ImageView pic;
       private Button takePhotoButton;
       FrameLayout preview;
       public static Camera isCameraAvailiable(){
          Camera object = null;
          try {

             object = Camera.open(); 
          }
          catch (Exception e){
          }
          return object; 
       }

       private PictureCallback capturedIt = new PictureCallback() {

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

          Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
          if(bitmap==null){
             Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();
          }
          else
          {
             Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();       
          }

       }
    };

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          takePhotoButton = (Button)findViewById(R.id.button_takephoto);
          cameraObject = isCameraAvailiable();
          showCamera = new ShowCamera(this, cameraObject);
          preview = (FrameLayout) findViewById(R.id.camera_preview);
          preview.addView(showCamera);



          takePhotoButton.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("static-access")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                  cameraObject.stopPreview();
                             preview.removeView(showCamera);
                cameraObject.release();
                cameraObject.open(1);


                    showCamera = new ShowCamera(MainActivity.this, cameraObject);

                      preview.addView(showCamera);
            }
        });

       }
       public void snapIt(View view){
          cameraObject.takePicture(null, null, capturedIt);
       }

       @Override
       public void onPause(){
           super.onPause();
           if (cameraObject != null) {
               cameraObject.stopPreview();
               cameraObject.release();
               cameraObject = null;
            }

              preview.removeView(showCamera);
       }

       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.activity_main, menu);
          return true;
       }
    }
package com.example.camera1;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {

       private SurfaceHolder holdMe;
       private Camera theCamera;

       public ShowCamera(Context context,Camera camera) {
          super(context);
          theCamera = camera;
          holdMe = getHolder();
          holdMe.addCallback(this);
       }

       @Override
       public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
       }

       @Override
       public void surfaceCreated(SurfaceHolder holder) {
          try   {
              theCamera.setDisplayOrientation(90);
             theCamera.setPreviewDisplay(holder);
             theCamera.startPreview(); 
          } catch (IOException e) {
          }
       }

       @Override
       public void surfaceDestroyed(SurfaceHolder arg0) {
           this.getHolder().removeCallback(this);
           theCamera.stopPreview(); 
           theCamera.release();
       }

    }
ShowCamera.java

package com.example.camera1;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

       private Camera cameraObject;
       private ShowCamera showCamera;
       private ImageView pic;
       private Button takePhotoButton;
       FrameLayout preview;
       public static Camera isCameraAvailiable(){
          Camera object = null;
          try {

             object = Camera.open(); 
          }
          catch (Exception e){
          }
          return object; 
       }

       private PictureCallback capturedIt = new PictureCallback() {

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

          Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
          if(bitmap==null){
             Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();
          }
          else
          {
             Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();       
          }

       }
    };

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          takePhotoButton = (Button)findViewById(R.id.button_takephoto);
          cameraObject = isCameraAvailiable();
          showCamera = new ShowCamera(this, cameraObject);
          preview = (FrameLayout) findViewById(R.id.camera_preview);
          preview.addView(showCamera);



          takePhotoButton.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("static-access")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                  cameraObject.stopPreview();
                             preview.removeView(showCamera);
                cameraObject.release();
                cameraObject.open(1);


                    showCamera = new ShowCamera(MainActivity.this, cameraObject);

                      preview.addView(showCamera);
            }
        });

       }
       public void snapIt(View view){
          cameraObject.takePicture(null, null, capturedIt);
       }

       @Override
       public void onPause(){
           super.onPause();
           if (cameraObject != null) {
               cameraObject.stopPreview();
               cameraObject.release();
               cameraObject = null;
            }

              preview.removeView(showCamera);
       }

       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.activity_main, menu);
          return true;
       }
    }
package com.example.camera1;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {

       private SurfaceHolder holdMe;
       private Camera theCamera;

       public ShowCamera(Context context,Camera camera) {
          super(context);
          theCamera = camera;
          holdMe = getHolder();
          holdMe.addCallback(this);
       }

       @Override
       public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
       }

       @Override
       public void surfaceCreated(SurfaceHolder holder) {
          try   {
              theCamera.setDisplayOrientation(90);
             theCamera.setPreviewDisplay(holder);
             theCamera.startPreview(); 
          } catch (IOException e) {
          }
       }

       @Override
       public void surfaceDestroyed(SurfaceHolder arg0) {
           this.getHolder().removeCallback(this);
           theCamera.stopPreview(); 
           theCamera.release();
       }

    }
活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="horizontal" >

   <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_weight="0.30"
      android:orientation="vertical" >

         <FrameLayout
            android:id="@+id/camera_preview"
            android:layout_width="fill_parent"
            android:layout_height="350dp" />

         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content" >

             <Button
                 android:id="@+id/button_capture"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:onClick="snapIt"
                 android:text="@string/Capture" />

             <Button
                 android:id="@+id/button_takephoto"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_below="@+id/button_capture"
                 android:text="Take Photo" />
         </RelativeLayout>

   </LinearLayout>

</LinearLayout>
改变 cameraObject.open(1)

cameraObject=Camera.open(1)

按钮takePhotoButton的内部方法调用onclick()。它会起作用的