gpt4 book ai didi

java.lang.RuntimeException : takePicture failed

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:35 25 4
gpt4 key购买 nike

当我连续单击“捕获”按钮(没有任何中断)时,出现运行时异常我该如何解决这个问题?

如果不可能,我该如何处理这个异常?

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) {

// line where getting RuntimeException
camera.takePicture(null, null, mPicture);

}
});

日志:

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;

}


}

最佳答案

首先,在 onPictureTaken 中捕获异常,保留空的 catch 部分并不是一个好的做法。然后,我会添加一个标志,以防止在保存上一张图片时调用 takePicture() 。稍后在按钮 onClick 中,您将检查是否可以调用 takePicture()。

  1. 将标志声明为您的 Activity 的成员:

    private boolean safeToTakePicture = false;
  2. surfaceChanged()中,只需在调用startPreview()后将标志设置为true即可:

    camera.startPreview();
    safeToTakePicture = true;
  3. 在您的 onClick() 监听器中检查标志并拍照(如果可以的话):

    if (safeToTakePicture) {
    mp.start();
    camera.takePicture(null, null, mPicture);
    safeToTakePicture = false;
    }
  4. onPictureTaken()中,保存图片后再次将标志设置为true(并添加异常打印):

    PictureCallback mPicture = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
    pictureFile = getOutputMediaFile();
    camera.startPreview();

    if (pictureFile == null) {
    //no path to picture, return
    safeToTakePicture = true;
    return;
    }
    try {
    FileOutputStream fos = new FileOutputStream(pictureFile);
    fos.write(data);
    fos.close();

    } catch (FileNotFoundException e) {
    e.printStackTrace(); //<-------- show exception
    } catch (IOException e) {
    e.printStackTrace(); //<-------- show exception
    }

    //finished saving picture
    safeToTakePicture = true;
    }
    };

注释:正如文档所说,“在拍照之前必须启动预览。”,因此可能的增强功能是使用 setPreviewCallback() 来注册在预览数据可用时调用的回调,并在调用 onPreviewFrame 时将标志设置为 true。

关于java.lang.RuntimeException : takePicture failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com