簡體   English   中英

CameraX - 解除綁定預覽用例時崩潰

[英]CameraX - crash when unbinding Preview UseCase

當用戶開始拍照時,我需要凍結(停止)預覽。 我四處搜索,發現這個SO 帖子提到了取消綁定預覽用例。 我已經嘗試過了,起初它可以在 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實例的方式是錯誤的 - 一旦我從getInstance方法返回的 Future 獲取並稍后使用它,我就存儲它。 但是當我再次嘗試獲得未來時,它並沒有幫助。 我沒有找到解決這個問題的方法,我正在考慮用其他一些相機庫替換 CameraX,因為我在這方面花了太多時間,但也許有人有一些答案。

我已經創建了一個演示項目,我在其中測試了這種奇怪的行為,因此您可以查看完整的代碼。

我已將此作為錯誤發布到Google 問題跟蹤器,此錯誤是預期行為。 要凍結預覽,您不應取消綁定預覽用例。 將來可能會有 API,但目前推薦的方法是存儲來自ImageAnalysis最新幀並將其放入與預覽重疊的 ImageView。

事實上,我在另一篇文章中發布的解決方案不適用於舊手機。 我在 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(ForwardingImageProxy.java:75) at androidx.camera.core.ForwardingImageProxy.getFormat(ForwardingImageProxy.java:75) at androidx.camera.core.ImageUtil.imageToJpegByteArray(ImageUtil.java:51) at androidx .camera.core.ImageSaver.run(ImageSaver.java:95) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) ) 在 java.lang.Thread.run(Thread.java:761)

使用我的 android 7 拍攝圖片時,預覽會在發布前自動凍結一小段時間(這可以解釋我的錯誤)。

OnImageSavedCallback凍結預覽怎么樣?

runOnUiThread {
   cameraProvider.unbind(previewUseCase)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM