Agu*_*ana 2 android android-jetpack android-camerax
目前我正在使用这个gradle
implementation "androidx.camera:camera-camera2:1.0.0-beta11"
implementation "androidx.camera:camera-lifecycle:1.0.0-beta11"
implementation "androidx.camera:camera-view:1.0.0-alpha18"
Run Code Online (Sandbox Code Playgroud)
所以我想在用户点击按钮后以编程方式更改相机镜头的朝向。这是我尝试使用的代码
class CameraFragment : Fragment() {
private var cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
lateinit var mContext: Context
lateinit var mActivity: FragmentActivity
override fun onAttach(context: Context) {
super.onAttach(context)
mContext = context
activity?.let { mActivity = it }
}
private fun toggleFrontBackCamera() {
if (cameraSelector == CameraSelector.DEFAULT_BACK_CAMERA) {
cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
} else if (cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA) {
cameraSelector == CameraSelector.DEFAULT_BACK_CAMERA
}
startCamera()
}
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(mContext)
cameraProviderFuture.addListener(Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
imageCapture = ImageCapture.Builder().build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(mContext))
}
}
Run Code Online (Sandbox Code Playgroud)
我使用该toggleFrontBackCamera()方法以编程方式更改镜头。
如您所见,默认摄像头是后置摄像头,然后当用户点击按钮更改摄像头时,toggleFrontBackCamera()将第一次调用该方法,然后摄像头将从后置更改为前置。这里没有问题
但问题是,当用户想再次更换相机镜头时,从前置摄像头到后置摄像头,则toggleFrontBackCamera()不起作用,它卡在了CameraSelector.DEFAULT_FRONT_CAMERA
那么如何以编程方式更改它呢?
首先初始化一个变量:
private var lensFacing = CameraSelector.LENS_FACING_BACK
Run Code Online (Sandbox Code Playgroud)
将相机切换方法更改为:
private fun toggleFrontBackCamera() {
lensFacing = if (CameraSelector.LENS_FACING_FRONT == lensFacing)
CameraSelector.LENS_FACING_BACK
else
CameraSelector.LENS_FACING_FRONT
startCamera()
}
Run Code Online (Sandbox Code Playgroud)
最后CameraSelector在您的实例中创建一个实例startCamera()并在中使用它cameraProvider.bindToLifecycle():
val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |