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

时间:2014-05-29 08:57:12

标签: android android-camera surfaceview surfaceholder

我正在开发自己的Android相机应用程序。我想要做的是当我打开我的应用程序时,它必须显示两个按钮,可能捕获拍照使用相机屏幕。当我点击捕捉按钮时,我可以拍摄当前位置的图像(来自后置摄像头)。如果我点击拍照按钮,我想捕捉这张照片我想从前置摄像头拍摄照片但它显示java.lang.runtimeexception method called after release()。在这里我附上了我的代码。所以请任何人帮我解决错误。

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

ShowCamera.java

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();
       }

    }

activity_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>

LogCat输出

05-29 12:42:56.378: E/AndroidRuntime(15990): FATAL EXCEPTION: main
05-29 12:42:56.378: E/AndroidRuntime(15990): java.lang.RuntimeException: Method called after release()
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.hardware.Camera.setDisplayOrientation(Native Method)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at com.example.camera1.ShowCamera.surfaceCreated(ShowCamera.java:29)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.SurfaceView.updateWindow(SurfaceView.java:580)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.SurfaceView.access$000(SurfaceView.java:83)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:726)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2084)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1125)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4607)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:747)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.Choreographer.doCallbacks(Choreographer.java:567)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.Choreographer.doFrame(Choreographer.java:536)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:733)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.os.Handler.handleCallback(Handler.java:615)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.os.Looper.loop(Looper.java:153)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at android.app.ActivityThread.main(ActivityThread.java:5086)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at java.lang.reflect.Method.invokeNative(Native Method)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at java.lang.reflect.Method.invoke(Method.java:511)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
05-29 12:42:56.378: E/AndroidRuntime(15990):    at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:0)

更改 cameraObject.open(1);

cameraObject = Camera.open(1);

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