java.lang.RuntimeException: takePicture 失败

10 浏览
0 Comments

java.lang.RuntimeException: takePicture 失败

当我持续点击拍摄按钮(没有任何间断)时,会出现运行时异常。如何解决这个问题?如果不可能解决,那么我该如何处理这个异常?

按钮点击事件的代码中,点击按钮后调用camera.takePicture方法的地方出现了RuntimeException异常。

日志信息如下:

02-12 14:48:41.580: E/AndroidRuntime(6997): FATAL EXCEPTION: main

02-12 14:48:41.580: E/AndroidRuntime(6997): java.lang.RuntimeException: takePicture failed

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.hardware.Camera.native_takePicture(Native Method)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.hardware.Camera.takePicture(Camera.java:1126)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.hardware.Camera.takePicture(Camera.java:1071)

02-12 14:48:41.580: E/AndroidRuntime(6997): at app.cam.shane.CameraLauncherActivity$3.onClick(CameraLauncherActivity.java:116)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.view.View.performClick(View.java:4223)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.view.View$PerformClick.run(View.java:17275)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.os.Handler.handleCallback(Handler.java:615)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.os.Handler.dispatchMessage(Handler.java:92)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.os.Looper.loop(Looper.java:137)

02-12 14:48:41.580: E/AndroidRuntime(6997): at android.app.ActivityThread.main(ActivityThread.java:4921)

02-12 14:48:41.580: E/AndroidRuntime(6997): at java.lang.reflect.Method.invokeNative(Native Method)

02-12 14:48:41.580: E/AndroidRuntime(6997): at java.lang.reflect.Method.invoke(Method.java:511)

02-12 14:48:41.580: E/AndroidRuntime(6997): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1036)

02-12 14:48:41.580: E/AndroidRuntime(6997): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:803)

02-12 14:48:41.580: E/AndroidRuntime(6997): at dalvik.system.NativeStart.main(Native Method)

注意:就像在“布丁相机”中一样,他们允许用户持续点击拍摄按钮,但不会显示异常。如果你连续点击50次,它会拍摄10张或更多的照片,每张照片之间有一定的时间间隔,但不会显示异常。请问我应该如何处理这个异常?

完整代码如下:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_camera);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

preview=(SurfaceView)findViewById(R.id.surface);

previewHolder=preview.getHolder();

previewHolder.addCallback(surfaceCallback);

previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

btnCapture = (ImageButton) findViewById(R.id.btnCapture);

final MediaPlayer mp = MediaPlayer.create(CameraLauncherActivity.this, R.raw.button);

btnCapture.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mp.start();

camera.takePicture(null, null, mPicture);

}

});

}

@Override

public void onResume() {

super.onResume();

camera=Camera.open();

}

@Override

public void onPause() {

super.onPause();

if (inPreview) {

camera.stopPreview();

}

camera.release();

camera=null;

inPreview=false;

}

private Camera.Size getBestPreviewSize(int width, int height,

Camera.Parameters parameters) {

Camera.Size result=null;

for (Camera.Size size : parameters.getSupportedPreviewSizes()) {

if (size.width <= width && size.height <= height) {

if (result == null) {

result=size;

}

else {

int resultArea=result.width * result.height;

int newArea=size.width * size.height;

if (newArea > resultArea) {

result=size;

}

}

}

}

return(result);

}

private Camera.Size getSmallestPictureSize(Camera.Parameters parameters) {

Camera.Size result=null;

for (Camera.Size size : parameters.getSupportedPictureSizes()) {

if (result == null) {

result=size;

}

else {

int resultArea=result.width * result.height;

int newArea=size.width * size.height;

if (newArea < resultArea) {

result=size;

}

}

}

return(result);

}

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){

public void surfaceCreated(SurfaceHolder holder) {

try {

camera.setPreviewDisplay(previewHolder);

} catch (Throwable t) {

Log.e("PreviewDemo-surfaceCallback",

"Exception in setPreviewDisplay()", t);

Toast.makeText(CameraLauncherActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();

}

}

public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {

params = camera.getParameters();

params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

Camera.Size size = getBestPreviewSize(width, height, params);

Camera.Size pictureSize=getSmallestPictureSize(params);

if (size != null && pictureSize != null) {

params.setPreviewSize(size.width, size.height);

params.setPictureSize(pictureSize.width,

pictureSize.height);

camera.setParameters(params);

camera.startPreview();

inPreview=true;

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

}

};

PictureCallback mPicture = new PictureCallback() {

@Override

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

pictureFile = getOutputMediaFile();

camera.startPreview();

if (pictureFile == null) {

return;

}

try {

FileOutputStream fos = new FileOutputStream(pictureFile);

fos.write(data);

fos.close();

} catch (FileNotFoundException e) {

} catch (IOException e) {

}

}

};

static File getOutputMediaFile() {

/* yyyy-MM-dd'T'HH:mm:ss.SSSZ */

timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")

.format(new Date());

// file name

mediaFile = new File(LoginActivity.mediaStorageDir.getPath() + File.separator

+ "IMG_" + timeStamp + ".jpg");

return mediaFile;

}

0