这是我的代码:
@Composable
fun MyCameraPreview() {
val lifecycleOwner = LocalLifecycleOwner.current
AndroidView(factory = { context ->
val previewView = PreviewView(context).apply {
scaleType = PreviewView.ScaleType.FILL_CENTER
layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
implementationMode = PreviewView.ImplementationMode.COMPATIBLE
}
ProcessCameraProvider.getInstance(context).apply {
addListener({
val cameraProvider = this.get()
val preview = androidx.camera.core.Preview.Builder().build().apply {
setSurfaceProvider(previewView.surfaceProvider)
}
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(lifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, preview)
} catch (e: Exception) {
e.printStackTrace()
}
}, ContextCompat.getMainExecutor(context))
}
previewView
})
}
我摘自这个答案。
我看到的只是黑屏。在清单中我请求了这些权限:
<uses-feature android:name="android.hardware.camera.any" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
(我还需要录音权限吗?我对录音不感兴趣。)
我还有什么遗漏的吗?如何让 PreviewView 真正显示来自相机的内容?
哦,日志里有这个错误:
尝试重新打开相机 10000 毫秒,但未成功。
事实证明,使用相机必须明确请求许可。仅将其放在清单中是不够的。
归根结底,这可能只是:
registerForActivityResult(ActivityResultContracts.RequestPermission()) { permission ->
Log.d("-- CAMERA PERMISSION --", permission.toString())
}.launch(Manifest.permission.CAMERA)
哦,不,我似乎不需要录制音频权限。