[英]Connecting SurfaceTextures to camerax preview usecase in android and receive frames on both
[英]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.