2014-01-30 28 views
0

我想要不斷捕獲照片,以便每次用戶不必按下按鈕。java.lang.RuntimeException:mCamera.takePicturePicture失敗android

我的代碼

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) 

回答

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