Проблемы при захвате нескольких фотографий: приложение перестает отвечать на запросы, предварительный просмотр камеры становится зеленым, и изображение не сохраняется - PullRequest
4 голосов
/ 17 марта 2011

Я успешно снял одну фотографию с помощью камеры в Android.Но когда я попытался сделать 5 снимков одновременно, приложение перестало отвечать, предварительный просмотр камеры становится зеленым, и изображение не сохраняется.То, что я увидел в трассировке стека, выглядит следующим образом (частично)

03-17 14: 19: 54.804: INFO / QualcommCameraHardware (19268): deinitPreview E 03-17 14: 19: 54.804: INFO /QualcommCameraHardware (19268): deinitPreview X 03-17 14: 19: 54.804: DEBUG / QualcommCameraHardware (19268): frame_thread X 03-17 14: 19: 54.834: DEBUG / QualcommCameraHardware (19268): snapshot_thread 0354.854: DEBUG / CameraService (19268): takePicture (pid 20509) 03-17 14: 19: 54.884: WARN / AudioFlinger (19268): запись заблокирована для 85 мсек 03-17 14: 19: 55.154: DEBUG / CameraService (19268): postShutter 03-17 14: 19: 55.284: DEBUG / CameraService (19268): postRaw 03-17 14: 19: 55.314: DEBUG / QualcommCameraHardware (19268): snapshot_thread X 03-17 14: 19: 55.344: DEBUG / QualcommCameraHardware (19268): snapshot_thread E 03-17 14: 19: 55.364: DEBUG / CameraService (19268): takePicture (pid 20509) 03-17 14: 19: 55.984: DEBUG / CameraService (19268): postShutter 03-17 14:19:56.064: DEBUG / CameraService (19268): postRaw 03-17 14: 19: 56.074: ОШИБКА / QualcommCameraHArdware (19268): родной_jpeg_encode: jpeg_encoder_encode не удалось.03-17 14: 19: 56.074: ОШИБКА / QualcommCameraHardware (19268): сбой кодирования jpeg 03-17 14: 19: 56.084: DEBUG / QualcommCameraHardware (19268): snapshot_thread X 03-17 14: 19: 56.154: INFO / DEBUG (19267): * ** * ** * ** * ** * ** * 03-17 14: 19: 56.164: INFO / DEBUG (19267): Создание отпечатка пальца: 'google_ion / google_ion / sapphire / sapphire: 1.6 / DRC83 / 14721: пользователь / adp, тест-ключи' 03-17 14: 19: 56.164: INFO / DEBUG (19267): pid: 19268, tid: 20813>>> / system / bin / mediaserver ... ... ... 14: 19: 59.894: INFO / ServiceManager (46): служба 'media.camera' не работает 03-17 14: 19: 59.894: WARN / Camera(20509): Сервер камеры умер!03-17 14: 19: 59.894: WARN / Camera (20509): ICamera умерла 03-17 14: 19: 59.894: ERROR / Camera (20509): Ошибка 100 03-17 14: 19: 59.915: WARN / AudioSystem (71): Сервер AudioFlinger умер!03-17 14: 20: 00.014: INFO / Process (71): отправка сигнала.PID: 18636 SIG: 3 03-17 14: 20: 00.054: INFO / dalvikvm (18636): threadid = 7: реагирование на сигнал 3

Я вызываю метод takePicture в циклечтобы сделать несколько фотографий;

for(int m = 0 ; m < 6; m++) {

    mPrimCamera.takePicture(null, mPictureCallbackMet, mPictureCallbackMet);
}

Я делаю это на HTC Magic под управлением Android 1.6.Я думаю, я использую неправильный способ сделать несколько фотографий. Как правильно сделать несколько снимков с помощью Android Camera API?

Ответы [ 4 ]

10 голосов
/ 17 марта 2011

Я не уверен, что Android API даже поддерживает режим серийной съемки.Одно можно сказать наверняка, вы не можете просто вызвать takePicture() в таком цикле.Это просто злоупотребление этими бедными API.

Как насчет следующего снимка в onPictureTaken()?(Очевидно, вы должны следить за количеством сделанных снимков и т. Д.)

Также как и в документации , не думайте, что это будет работать на каждом устройстве.

Я написал вышеуказанный ответ в 2011 году, с тех пор эволюция камеры

РЕДАКТИРОВАТЬ: теперь в Camera2 поддерживается режим серийной съемки: https://developer.android.com/reference/android/hardware/camera2/package-summary.html

См. https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html

3 голосов
/ 09 марта 2013

Следующее фото можно сделать только после вызова метода Camera.PictureCallback.onPictureTaken и перезапуска предварительного просмотра камеры.

private void takePhoto() {
    if (!(cameraPreview.isRunning())) {
        Log.i(LOG_TAG, "Camera is not ready. Skip frame");
        return;
    }

    camera.takePicture(null, null, this);
    cameraPreview.onPictureTook();
}

public void onPictureTaken(byte[] data, Camera camera) {
    // save photo
    cameraPreview.start();
}


public class CameraPreview extends SurfaceView {

    private boolean previewRunning = false;

    /**
     * Should be called after calling camera.takePicture
     */
    public void onPictureTook() {
        previewRunning = false;
    }

    public boolean isRunning() {
        return previewRunning;
    }

    public void start() {
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            previewRunning = true;
        } catch (Exception ignored) {
            Log.e(LOG_TAG, "Error starting camera preview", ignored);
        }
    }
}
2 голосов
/ 07 февраля 2013

Я нашел один ответ здесь, и это также захватывает несколько фотографий

Как сделать несколько фотографий, прежде чем отклонить намерение камеры?

1 голос
/ 29 марта 2011

Я не нашел поддержки API для этого. И многократный вызов метода takePicture из цикла не работает. Итак, я нашел обходной путь. Код все еще находится в цикле, но я сейчас использую Thread;

private class CaptureThread extends Thread {

        @Override
        public void run() {

            int count = 0;

            while(count < mNo) {
                mFileName = mLocation + "/pic" + count + ".jpg";

                mCamera.takePicture(null, mPictureCallback, mPictureCallback);

                count++;

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException exception) {
                    exception.printStackTrace();
                }
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...