Edit: я узнал, что проблема заключается в функции onPreviewFrame:Как сохранить фотографию с камеры Android
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (frameCount == 0) {
start = System.currentTimeMillis();
} else if (frameCount % 100 == 0) {
Log.e("FPS", 1000 * frameCount
/(System.currentTimeMillis() - start) + "");
}
frameCount++;
Bitmap temp = BitmapFactory.decodeByteArray(data, 0, data.length);
try {
temp.compress(CompressFormat.JPEG, 90, new FileOutputStream(new File("/sdcard/"+frameCount+".jpg")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.addCallbackBuffer(data);
}
Если удалить весь код, связанный с Bitmap, то программа может сделать снимок без каких-либо ошибок. Как сохранить изображения в кадре и лучшее изображение с помощью Camera.takePicture? Я попытался сохранить фотографию с камеры, когда нажата кнопка, и запустите другую операцию, чтобы отредактировать фотографию.
mTakePic.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mTakePic.setImageDrawable(takePicDown);
mCamera.takePicture(new ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
}
}, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] yuv, Camera camera) {
Intent editImage = new Intent(getApplicationContext(), EditActivity.class);
if(savePhoto != null) {
try {
savePhoto.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
savePhoto = new SavePhotoTask();
savePhoto.execute(yuv);
// releaseCamera();
startActivity(editImage);
}
});
} else if (event.getAction() == MotionEvent.ACTION_UP) {
mTakePic.setImageDrawable(takePicUp);
}
return true;
}
});
Иногда это проходит гладко, без ошибок, но в большинстве случаев это заканчивается ошибка, и я должен перезагрузить телефон, чтобы получить камеру снова работает. Я использовал SurfaceView для предварительного просмотра рамки камеры.
Спасибо @MattDavis, но это не ответ на мой вопрос. Я отредактировал вопрос, пожалуйста, взгляните на него –
Я отредактировал свой ответ, чтобы показать, как сохранить, сообщите мне, если это поможет. – MattDavis