尝试使用
CameraX
启动相机时,出现以下错误:
Caused by: java.lang.IllegalStateException: CameraX is not configured properly. The most likely cause is you did not include a default implementation in your build such as 'camera-camera2'.
at androidx.camera.core.CameraX.<init> (CameraX.java:107)
at androidx.camera.lifecycle.ProcessCameraProvider.getOrCreateCameraXInstance (ProcessCameraProvider.java:196)
at androidx.camera.lifecycle.ProcessCameraProvider.getInstance (ProcessCameraProvider.java:182)
当我打电话时就会发生:
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
重新启动后解锁设备(即退出直接启动模式)后尝试启动时,代码可以正常工作,相机也可以正常工作。
如何解决这个问题?
问题是
CameraX
库不适合在直接启动条件下工作。更具体地说,在调用 ProcessCameraProvider.getInstance(context)
时,配置相机时,在 CameraX
内部调用了以下代码(您可以在 CameraX
源代码 - 第 ~180 行中查找):
ServiceInfo serviceInfo = appContext.getPackageManager().getServiceInfo(
new ComponentName(appContext, MetadataHolderService.class),
PackageManager.GET_META_DATA | PackageManager.MATCH_DISABLED_COMPONENTS);
此代码尝试通过实现库提供的元数据检索 CameraXConfig.Provider,但抛出了
PackageManager.NameNotFoundException
,导致整个相机初始化过程失败。
此时我意识到我不应该真正期望
CameraX
维护人员解决这个问题,因此我创建了一个解决方法,在启动相机之前,检查我们是否使用 UserManager 在直接启动模式下运行.isUserUnlocked:
val userManager = getSystemService(USER_SERVICE) as UserManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N &&
!userManager.isUserUnlocked
) {
// We are in the direct boot mode - request the user to unlock the device first...
}
这可以避免崩溃,因为解锁设备后会启动相机。