Android Java中如何调用前置摄像头?现有代码无法打开前置摄像头
解决Android调用前置摄像头失效的问题
你当前代码的问题在于:android.intent.extras.CAMERA_FACING并非Android官方定义的标准Extra字段,MediaStore.ACTION_IMAGE_CAPTURE是隐式意图,会调用系统或第三方相机应用,大部分厂商的相机App并不识别这个参数,因此无法强制切换到前置摄像头。
以下是两种可靠的解决方案:
方案一:使用CameraX(推荐,兼容性强)
CameraX是Jetpack提供的相机组件,统一了不同Android版本和设备的相机调用逻辑,可轻松指定前置摄像头:
- 在
build.gradle中添加依赖:
dependencies { def camerax_version = "1.3.0" implementation "androidx.camera:camera-core:$camerax_version" implementation "androidx.camera:camera-camera2:$camerax_version" implementation "androidx.camera:camera-lifecycle:$camerax_version" implementation "androidx.camera:camera-view:$camerax_version" }
- 在布局中添加
PreviewView用于预览:
<androidx.camera.view.PreviewView android:id="@+id/previewView" android:layout_width="match_parent" android:layout_height="match_parent"/>
- 在Activity中初始化CameraX并绑定前置摄像头:
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.camera.core.CameraSelector import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class CameraActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_camera) val previewView = findViewById<androidx.camera.view.PreviewView>(R.id.previewView) CoroutineScope(Dispatchers.Main).launch { val cameraProvider = ProcessCameraProvider.getInstance(this@CameraActivity).get() // 创建预览用例 val preview = Preview.Builder().build().apply { setSurfaceProvider(previewView.surfaceProvider) } // 指定前置摄像头 val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA try { // 绑定生命周期和相机用例 cameraProvider.unbindAll() cameraProvider.bindToLifecycle(this@CameraActivity, cameraSelector, preview) } catch(exc: Exception) { // 处理相机绑定异常 } } } }
若需实现拍照功能,只需添加ImageCapture用例即可,CameraX会自动处理权限和兼容性问题。
方案二:使用旧版Camera API(仅适配Android 5.0及以下旧设备)
注意:此API已被官方废弃,仅用于特殊旧设备场景:
- 在Manifest中添加相机权限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.front" />
- 代码中打开前置摄像头:
import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import androidx.appcompat.app.AppCompatActivity; public class OldCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback { private Camera camera; private SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surfaceView = new SurfaceView(this); setContentView(surfaceView); surfaceView.getHolder().addCallback(this); } private Camera getFrontCamera() { int cameraCount = Camera.getNumberOfCameras(); for (int i = 0; i < cameraCount; i++) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(i, info); if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { try { return Camera.open(i); } catch (Exception e) { e.printStackTrace(); } } } return null; } @Override public void surfaceCreated(SurfaceHolder holder) { camera = getFrontCamera(); try { camera.setPreviewDisplay(holder); camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 处理预览尺寸变化 } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } } }
内容的提问来源于stack exchange,提问作者Ouriel Bennathan
相关产品推荐
相关产品推荐

