首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 檢測設備前置攝像頭:Camera.getNumberOfCameras + CameraInfo 遍歷判斷

     編輯:程式設計綜合問答

需求

啟動相機錄像前,檢測設備是否存在前置攝像頭,若有則切換至前置。

核心 API (Camera1 舊版,仍廣泛兼容)

public boolean hasFrontCamera() {
    int numCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numCameras; i++) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            return true; // 找到前置攝像頭
        }
    }
    return false;
}

// 獲取前置攝像頭 ID (用於 Camera.open(id))
public int getFrontCameraId() {
    int numCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numCameras; i++) {
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            return i;
        }
    }
    return -1; // 無前置
}

現代 CameraX / Camera2 寫法 (推薦新項目)

CameraX (Jetpack)

// 依賴: camera-core, camera-camera2, camera-view
ProcessCameraProvider provider = ProcessCameraProvider.getInstance(context).get();
CameraSelector frontSelector = CameraSelector.DEFAULT_FRONT_CAMERA;
if (provider.hasCamera(frontSelector)) {
    // 有前置攝像頭
    UseCase preview = new Preview.Builder().build();
    provider.bindToLifecycle(this, frontSelector, preview);
}

Camera2 API

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    for (String cameraId : manager.getCameraIdList()) {
        CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
        Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
        if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
            // 找到前置
        }
    }
} catch (CameraAccessException e) { e.printStackTrace(); }

權限聲明

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

避坑指南

  • Camera 類已棄用 (API 21+),但未移除,維舊項目仍可用。
  • 新項目**強制推薦 CameraX**,生命周期感知、設備兼容性由 Google 維護、API 簡潔。
  • 前置攝像頭通常不支持自動對焦、閃光燈,參數配置需區分。
  • 多攝像頭設備 (雙/三/四攝) getNumberOfCameras() 返回邏輯攝像頭數,物理鏡頭可能更多。

檢測前置攝像頭:舊項目用 Camera.getNumberOfCameras() 遍歷 CameraInfo,新項目直接用 CameraX CameraSelector.DEFAULT_FRONT_CAMERA,一行代碼解決兼容性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved