CameraX - cra sh при отмене привязки Preview UseCase - PullRequest
1 голос
/ 19 марта 2020

Мне нужно заморозить (остановить) предварительный просмотр, когда пользователь начинает фотографировать. Я искал и нашел этот ТАК пост, в котором упоминается необязательный Preview UseCase. Я пробовал это, и сначала он работает правильно на Android 9+, но на более низком Android я получаю следующую ошибку в Logcat, и изображение не делается.

ImageCapture: takePictureInternal onFailure

androidx.camera.core.ImageCaptureException: The completer object was garbage collected - this future would otherwise never complete. The tag was: FutureChain[androidx.camera.core.impl.utils.futures.ChainingListenableFuture@3ee79178]
        at androidx.camera.core.ImageCapture$ImageCaptureRequest.lambda$notifyCallbackError$1$ImageCapture$ImageCaptureRequest(ImageCapture.java:1911)
        at androidx.camera.core.-$$Lambda$ImageCapture$ImageCaptureRequest$1G7WSvt8TANxhZtOyewefm68pg4.run(lambda)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: androidx.concurrent.futures.CallbackToFutureAdapter$FutureGarbageCollectedException: The completer object was garbage collected - this future would otherwise never complete. The tag was: FutureChain[androidx.camera.core.impl.utils.futures.ChainingListenableFuture@3ee79178]

А также много журналы начинают появляться как

gralloc_ranchu: gralloc_lock usage mismatch usage=0x30 cb->usage=0x3

Я подозреваю, что неправильный способ получения экземпляра ProcessCameraProvider - я просто сохраняю его, как только получаю из Future, возвращенного методом getInstance, и использую его позже , Но когда я снова попытался получить будущее, это не помогло. Я не нашел обходного пути вокруг этого, и я подумываю заменить CameraX какой-нибудь другой библиотекой Camera, потому что я потратил слишком много времени на это, но, возможно, у кого-то есть какой-то ответ.

Я создал демонстрационный проект , где я тестирую это странное поведение, чтобы вы могли взглянуть на полный код.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Я опубликовал это как ошибку на Google Issue tracker , и эта ошибка - предполагаемое поведение. Чтобы заморозить предварительный просмотр, вы не должны отменять привязку предварительного просмотра. В будущем может появиться API для этого, но в настоящее время рекомендуемый способ - сохранить последний кадр из ImageAnalysis и поместить его в ImageView, перекрывая предварительный просмотр.

0 голосов
/ 14 апреля 2020

Действительно, решение, которое я разместил в другом посте, не работает со старыми телефонами. Я протестировал его на android 7, и у меня была следующая ошибка:

E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: CameraX-camerax_io_0 Процесс: com.hermosodev.camerax, PID: 23735 java. lang.IllegalStateException: изображение уже закрыто на android .media.Image.throwISEIfImageIsInvalid (Image. java: 68) на android .media.ImageReader $ SurfaceImage.getFormat (ImageReader. java: 679) на androidx .camera.core.AndroidImageProxy.getFormat (AndroidImageProxy. java: 78) в androidx.camera.core.ForwardingImageProxy.getFormat (ForwardingImageProxy. java: 75) в androidx.camera.core.ForwardingImageProxy.getFormat (Forward. 1020 *: 75) в androidx.camera.core.ForwardingImageProxy.getFormat (ForwardingImageProxy. java: 75) в androidx.camera.core.ImageUtil.imageToJpegByteArray (ImageUtil. java: 51) в androidx.camera.c. ImageSaver.run (ImageSaver. java: 95) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1133) в java .util.concurrent.ThreadPoolExecutor $ Worker.run (Th readPoolExecutor. java: 607) на java .lang.Thread.run (Тема. java: 761)

С моим android 7, когда я снимаю картинку, предварительный просмотр автоматически останавливается на короткое время перед его выпуском (что может объяснить мою ошибку).

Как насчет замораживания предварительного просмотра в OnImageSavedCallback?

runOnUiThread {
   cameraProvider.unbind(previewUseCase)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...