android - 如何解决CameraX闪屏问题
问题描述
在 1.0.0-beta03 CameraX 版本之前,我使用的是 1.0.0-alpha06 版本,图像分析和条形码扫描对我来说效果很好。现在在较新的版本上,它并不总是有效,因为相机预览有时会闪烁,并且图像最终不够清晰,无法检测到条形码。
我认为问题在于相机占用了太多内存。我注意到,如果我清除在后台运行的应用程序并重新启动应用程序,相机质量会变得更好,不会出现这种屏幕闪烁。当我这样做时,它仅从我的应用程序中就说“释放了 200mb 内存”。我无法一直重现闪烁的错误,但我所做的是杀死应用程序,重新启动并最终开始闪烁。在我的BarcodeScanFragment 中,这里是我的 onDestroy
override fun onDestroy() {
super.onDestroy()
// I call cameraUtil.unbindCamera() which executes code below:
cameraProvider?.unbindAll()
cameraExecutor?.shutdown()
}
这是我的CameraUtil(用于为不同片段初始化相机)setupCameraX函数:
fun setupCameraX(previewView: PreviewView,fragment:Fragment, analyzer:ImageAnalysis.Analyzer?) {
previewView.preferredImplementationMode = PreviewView.ImplementationMode.TEXTURE_VIEW
val cameraProviderFuture = ProcessCameraProvider.getInstance(fragment.context!!)
val rotation = previewView.display.rotation
cameraExecutor = Executors.newSingleThreadExecutor()
cameraProviderFuture.addListener(Runnable {
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
val preview = Preview.Builder().setTargetRotation(rotation).build()
preview.setSurfaceProvider(previewView.createSurfaceProvider(null))
var useCase:UseCase?=null
if(analyzer==null){
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setTargetRotation(previewView.display.rotation)
.build()
useCase = imageCapture!!
}else{
val imageAnalysis = ImageAnalysis.Builder()
.setTargetRotation(rotation)
.build()
.also{
it.setAnalyzer(cameraExecutor!!, analyzer)
}
useCase = imageAnalysis
}
cameraProvider?.unbindAll()
try{
camera = cameraProvider?.bindToLifecycle(fragment, cameraSelector, preview,useCase)
preview.setSurfaceProvider(previewView.createSurfaceProvider(camera?.cameraInfo))
}catch(ex: Exception){
Log.e("error",ex.message,ex)
}
}, ContextCompat.getMainExecutor(fragment.context))
}
我一定要打电话
cameraProvider?.unbindAll()
使之前的camerax用例不受约束
编辑:设备华为 P smart 2019
解决方案
就我而言,只有当我从后堆栈中弹出一个片段时,我才会遇到闪烁。
我正在使用相机 x 版本 1.0.0-beta05
最后,我可以通过删除此行来解决此闪烁问题
previewView.preferredImplementationMode = PreviewView.ImplementationMode.TEXTURE_VIEW
推荐阅读
- python - 从 txt 文件中获取行并显示在 python 网络服务器上
- javascript - ES6 模板字符串:如何嵌套它们?
- c# - 在半径内激活动画
- layout - 在 TVOS 上的 SwiftUI 布局中苦苦挣扎
- firebase - 用户没有帐户的游戏的 Firestore 安全性
- c++ - 如何创建从 Maya(或类似)到 Unreal Engine 的自定义数据导出插件?
- ruby-on-rails - 在 Rails 中显示查询结果时遇到问题
- python - 使用python在浏览器功能中创建视图
- sql - 列出没有销售的客户和产品
- shell - 如何删除文件开头的两个匹配字符串(仅第一次出现)之间的文本?