Сначала, пожалуйста, извините мой плохой английский. У меня проблема с программным фотографированием. Я написал приложение, которое собирает фотографии на основе таймера обратного отсчета. и после этого фотографии обрабатываются с помощью кода C++.
Я использую фиктивный SurfaceView, потому что мне не нужен предварительный просмотр в пользовательском интерфейсе. Приведенный ниже код работает на моем телефоне Xperia mini — API 15 (поэтому разрешения и код будут правильными), но я позаимствовал школьный Nexus 5 — API 21, и есть проблема с предварительным просмотром.
takePicture: camera 0: Cannot take picture without preview enabled
Я нашел решение, в котором вместо setPreviewDisplay используется setPreviewTexture (см. ниже). Это работает для первой фотографии, которая обычно сохраняется, но я получаю ту же ошибку после второго вызова takePicture().
Спасибо за каждый совет, ЛС
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) {}