SurfaceView становится черным при вызове Camera.stopPreview () - PullRequest
1 голос
/ 23 августа 2011

Я занимаюсь обработкой изображений превью, снятых камерой.Это трудоемкая задача процессора, и я должен остановить предварительный просмотр, чтобы сделать его быстрее.Перед обработкой нового кадра я вызываю Camera.stopPreview () и после Camera.startPreview ().

Однако я бы хотел, чтобы последний снятый кадр отображался в SurfaceView после остановки предварительного просмотра.Он работает «из коробки» на устройствах 2.3, однако SurfaceView становится черным после вызова Camera.stopPreview () на старых версиях SDK.Кто-нибудь знает, что изменилось и что делать?

1 Ответ

0 голосов
/ 23 августа 2011

Да, это было улучшение 2.3.

У меня была эта проблема и в 2.2, не было возможности поработать с предварительным изображением, хотя теоретически это было возможно в соответствии с API.Чтобы решить эту проблему, мне нужно было сделать снимок, используя Camera.takePicture(null, null, Camera.PictureCallback myCallback) (см. Info здесь ), а затем реализовать обратный вызов для обработки снятого изображения.Экземпляр класса, который реализует этот обратный вызов, фактически является параметром для передачи в Camera.takePicture(), а сам метод обратного вызова выглядит следующим образом:

public void onPictureTaken(byte[] JPEGData, Camera camera) {
    final Bitmap bitmap = createBitmapFromView(JPEGData);

    // do something with the Bitmap
}

Этот способ предотвращает сохранение изображения во внешнем хранилище.с обычными снимками, сделанными с помощью приложения камеры.Если вам нужно сериализовать Bitmap, вам придется делать это явно.Но это не мешает генерации звука триггера камеры.

Camera.takePicture() должен вызываться при запуске предварительного просмотра.stopPreview() можно вызвать сразу после.

Одна вещь, с которой следует быть осторожным с /! \:

Camera.takePicture(), не является реентерабельной (вообще).Обратный вызов должен быть возвращен до любого последующего вызова Camera.takePicture().Это замораживало мой телефон, мне пришлось выключить и перезапустить его, прежде чем он снова заработал.Поскольку действие было вызвано кнопкой, на моей стороне мне пришлось экранировать его логическим значением:

if (!mPictureTaken) {
    mPictureTaken = true; // absolutely NOT reentrant. Any double click sticks the phone otherwise.
    mCameraView.takePicture(callback);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...