You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java中如何调用前置摄像头?现有代码无法打开前置摄像头

解决Android调用前置摄像头失效的问题

你当前代码的问题在于:android.intent.extras.CAMERA_FACING并非Android官方定义的标准Extra字段,MediaStore.ACTION_IMAGE_CAPTURE是隐式意图,会调用系统或第三方相机应用,大部分厂商的相机App并不识别这个参数,因此无法强制切换到前置摄像头。

以下是两种可靠的解决方案:

方案一:使用CameraX(推荐,兼容性强)

CameraX是Jetpack提供的相机组件,统一了不同Android版本和设备的相机调用逻辑,可轻松指定前置摄像头:

  1. 在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"
}
  1. 在布局中添加PreviewView用于预览:
<androidx.camera.view.PreviewView
    android:id="@+id/previewView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. 在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已被官方废弃,仅用于特殊旧设备场景:

  1. 在Manifest中添加相机权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
  1. 代码中打开前置摄像头:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:01:13