java.lang.RuntimeException:在mCamera.takePicture android上takePicture失败

时间:2014-01-30 12:39:16

标签: android multithreading exception camera android-camera

我想连续拍摄照片,以便每次用户都不必按下按钮。

我的代码

public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener {
private static final String TAG = "CameraTest";
Camera mCamera;
boolean mPreviewRunning = false;
String currentDateTimeString;
Timer myTimer;
ImageView img;
static boolean flagShowPic = true;
public static int TIME_BET_SHOOT = 1000;

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    try {
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.cameraview);

        img = (ImageView) findViewById(R.id.blankImage);

        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        mSurfaceView.setOnClickListener(this);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {
        if (data != null) {
            try {
                currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
                currentDateTimeString = currentDateTimeString.replace(" ", "_");
                currentDateTimeString = currentDateTimeString.replace(":", "");
                File f = new File(CaptureCameraImage.imageSavePath + currentDateTimeString + ".png");
                f.createNewFile();
                FileOutputStream fo = new FileOutputStream(f);
                fo.write(data);
                fo.close();
                if (flagShowPic == true) {
                    BitmapFactory.Options opts = new BitmapFactory.Options();
                    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
                    bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false);
                    img.setImageBitmap(bitmap);
                }
                mCamera.startPreview();
            } catch (Exception e) {
                e.printStackTrace();
            }
            setResult(585);
        }
    }
};

//  protected void onStop() {
//      Log.e(TAG, "onStop");
//      super.onStop();
//      if (null != myTimer) {
//          myTimer.cancel();
//      }
//      if (null != mCamera) {
//          mCamera.stopPreview();
//          mPreviewRunning = false;
//          mCamera.release();
//      }
//  }

public void surfaceCreated(SurfaceHolder holder) {
    Log.e(TAG, "surfaceCreated");
    try {
        mCamera = Camera.open(CaptureCameraImage.cameraID);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    Log.e(TAG, "surfaceChanged");
    try {
        if (mPreviewRunning) {
            //mCamera.stopPreview();
        }

        Camera.Parameters p = mCamera.getParameters();
        p.setPreviewSize(300, 300);

        if (CaptureCameraImage.cameraID == 0) {
            String stringFlashMode = p.getFlashMode();
            if (stringFlashMode.equals("torch"))
                p.setFlashMode("on"); // Light is set off, flash is set to
            // normal 'on' mode
            else
                p.setFlashMode("torch");
        }

        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();
        mPreviewRunning = true;

        myTimer = new Timer();
        MyTimerTask myTimerTask = new MyTimerTask();
        myTimer.scheduleAtFixedRate(myTimerTask, 1000, TIME_BET_SHOOT);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    Log.e(TAG, "surfaceDestroyed");
//      mCamera.stopPreview();
//      mPreviewRunning = false;
//      mCamera.release();
}

private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;

private class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mPreviewRunning == true)
                    mCamera.takePicture(null, mPictureCallback, mPictureCallback);
            }
        });
    }
}

@Override
public void onClick(View v) {
}
}

我得到了异常

 FATAL EXCEPTION: main java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1194)
at android.hardware.Camera.takePicture(Camera.java:1139)
at com.androidmyway.demo.capturecameraimage.CameraView$MyTimerTask$1.run(CameraView.java:152)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:2)

用它打开相机。打开相机时避免错误。

private void safeCameraOpen(int id) {

        try {
            releaseCameraAndPreview();
            mCamera = Camera.open(id);
        } catch (Exception e) {
            Log.e(getString(R.string.app_name), "failed to open Camera");
            e.printStackTrace();
        }

    }

private void releaseCameraAndPreview() {
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }