Android Camera.takePicture () не возвращается несколько раз? - PullRequest
3 голосов
/ 02 октября 2011

Пишу приложение для андроида для фотографирования.Код выполняет некоторую обработку после получения кадра из предварительного просмотра в onPreviewFrame (данные byte [], Camera camera).Проблема заключается в функции takePicture () android.hardware.Camera, которая иногда делает именно то, что я хочу, а иногда не возвращает, и никакие обратные вызовы не будут вызваны.Когда я запускаю приложение несколько раз, первый снимок не возвращается, а иногда я могу сделать четыре снимка, а пятый вызывает зависание приложения.Существует аналогичная тема: проблема с фотографированием с помощью камеры Android .Предлагаемое решение состоит в том, чтобы использовать кадр из последнего предварительного просмотра, но, конечно, это не очень хорошее решение!Эта проблема может возникнуть, потому что takePicture является Asancronous ( Android Doc ).

Я просто вызываю функцию takePicture () следующим образом:

public static void takePicture() {
   mCamera.takePicture(null, null, jpegCallback);
}

Здесь - это ссылка на вывод Logcat.Вы можете искать в выводе фразу «takePicture», и вы увидите, что эта функция иногда возвращает, а иногда не возвращает.

Это вывод, когда takePicture возвращает:

10-02 19:24:36.570: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:24:36.570: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MQ.put(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.570: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:24:36.578: DEBUG/MessageQueue(3198): MQ.get(5,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.578: DEBUG/CameraHal(3198): 1458: CameraStop() ENTER
10-02 19:24:36.617: DEBUG/CameraHal(3198): 1543: CameraStop() EXIT
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.put(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/MessageQueue(3198): MQ.get(14,0xb6590,0x0,0x8,0x80b0af55)
10-02 19:24:36.617: DEBUG/CameraHal(3198): 2497: takePicture() EXIT
10-02 19:24:36.617: INFO/ShotSingle(3198): ShotSingle::takePicture end

, и это вывод, когда takePicture не возвращает:

10-02 19:25:20.671: INFO/ShotSingle(3198): ShotSingle::takePicture start
10-02 19:25:20.671: DEBUG/CameraHal(3198): 2489: takePicture() ENTER
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MQ.put(5,0xb8cb8,0x0,0x8,0x80b0af55)
10-02 19:25:20.671: DEBUG/MessageQueue(3198): MessageQueue::put EXIT
10-02 19:25:21.343: INFO/StatusBarPolicy(3393): onSignalStrengthsChanged
10-02 19:25:22.609: WARN/PowerManagerService(3330): Timer 0x7->0x3|0x7
10-02 19:25:23.062: INFO/AudioStreamOutALSA(3198): (virtual android::status_t android::AudioStreamOutALSA::standby())  enter
10-02 19:25:23.125: ERROR/AudioStreamOutALSA(3198): Output standby called!!. Turn off PCM device.
10-02 19:25:23.125: INFO/ALSAStreamOps(3198): [ALSAStreamOps]codecOff mode = 0
10-02 19:25:23.234: INFO/AudioStreamOutALSA(3198): [AudioOutLock]Relase_wake_Lock 

У кого-нибудь есть объяснения?или решение этой проблемы?

Ответы [ 2 ]

6 голосов
/ 03 октября 2011

Похоже, проблема в недостатке памяти. Я решил это, добавив System.gc () непосредственно перед вызовом takePicture ().

System.gc();
CameraParameters.mCamera.takePicture(null, null, jpegCallback);
2 голосов
/ 14 сентября 2012

Пожалуйста, смотрите это .Если вы используете обратный вызов для предварительного просмотра, вы можете решить эту проблему, удалив ее перед съемкой.

mCamera.setPreviewCallback(null);
mCamera.takePicture(null, null, mPictureCallback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...