【问题标题】:java.lang.RuntimeException: takePicture failed on mCamera.takePicture androidjava.lang.RuntimeException:在 mCamera.takePicture android 上拍摄失败
【发布时间】:2014-01-30 12:39:16
【问题描述】:

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

我的代码

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)

【问题讨论】:

    标签: android multithreading exception camera android-camera


    【解决方案1】:

    使用它来打开相机。以避免在打开相机时出错。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2013-03-20
      • 2015-01-03
      • 2016-09-06
      • 1970-01-01
      • 2016-01-19
      • 2013-03-17
      相关资源
      最近更新 更多