啟動相機錄像前,檢測設備是否存在前置攝像頭,若有則切換至前置。
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; // 無前置
}
// 依賴: 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);
}
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+),但未移除,維舊項目仍可用。getNumberOfCameras() 返回邏輯攝像頭數,物理鏡頭可能更多。檢測前置攝像頭:舊項目用 Camera.getNumberOfCameras() 遍歷 CameraInfo,新項目直接用 CameraX CameraSelector.DEFAULT_FRONT_CAMERA,一行代碼解決兼容性。