Да, это было улучшение 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);
}