Сначала, пожалуйста, извините мой плохой английский. У меня проблема с программным фотографированием. Я написал приложение, которое делает сбор фотографий на основе countdown timer, после чего фотографии обрабатываются с использованием кода C++.Метод Camera.takePicture() аварии на Nexus 5, но Xperia mini в порядке
Я использую dummy SurfaceView, потому что мне не нужен предварительный просмотр в пользовательском интерфейсе. Следующий код работает на моем телефоне Xperia mini - API 15 (так что разрешения и код будут верными), но я позаимствовал School Nexus 5 - API 21 и есть проблема с предварительным просмотром.
takePicture: camera 0: Cannot take picture without preview enabled
Я нашел solution, который использует setPreviewTexture (комментируемое ниже) вместо setPreviewDisplay. Он работает для первой фотографии, которая обычно сохраняется, но я получаю ту же ошибку после второго вызова takePicture().
Спасибо за каждый совет, LS
Camera camera;
@Override
protected void onResume() {
super.onResume();
// is camera on device?
if(!checkCameraHardware()) return;
releaseCamera();
try {
camera.stopPreview();
} catch (Exception e){
Log.d(TAG, "No preview before.");
}
SurfaceView dummy = new SurfaceView(this);
camera = Camera.open();
Camera.Parameters params = camera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
try {
//camera.setPreviewTexture(new SurfaceTexture(10));
camera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
РЕШЕНИЕ:
мне нужно обновить предварительный просмотр. Код ниже работает и на Xperie и Nexus. Вопрос остается, почему я должен использовать setPreviewTexture, потому что setPreviewDisplay всегда возвращает ошибку на Nexus.
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
// save picture
refreshPreview();
}
});
public void refreshPreview() {
try {
camera.stopPreview();
} catch (Exception e) {}
try {
camera.startPreview();
} catch (Exception e) {}
}
и функции onResume()
try {
camera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e) {}
Вам не нужен SurfaceView. См. Http://stackoverflow.com/questions/22462360/android-use-camera-without-surfaceview-or-textureview/ – fadden