一、Camera.CameraInfo
- Camera.CameraInfo 是用于获取设备上摄像头信息的一个类,它提供摄像头的各种详细信息,例如,摄像头的方向、是否支持闪光灯等,以下是它的常用属性
-
static int CAMERA_FACING_BACK
:表示设备的后置摄像头,手机背后的 -
static int CAMERA_FACING_FRONT
:表示设备的前置摄像头,手机屏幕上的 -
int facing
:表示摄像头镜头的方向,它的值可能是-
Camera.CameraInfo.CAMERA_FACING_BACK
:后置摄像头,手机背后的 -
Camera.CameraInfo.CAMERA_FACING_FRONT
:前置摄像头,手机屏幕上的
-
-
int orientation
:表示摄像头图像的自然方向(逆时针),通常会根据它在显示图像时对其进行适当的旋转 -
boolean canDisableShutterSound
:表示是否可以禁用快门声音
二、使用 Camera.CameraInfo
1、操作步骤
-
要使用 Camera.CameraInfo,需要先获取到设备上所有可用的摄像头 ID,通过调用 Camera.getNumberOfCameras 方法
-
遍历这些摄像头 ID,对每个 ID 使用 Camera.getCameraInfo 方法来获取每个摄像头的详细信息
2、具体实现
package com.my.camera;
import androidx.appcompat.app.AppCompatActivity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
@SuppressWarnings("all")
public class CameraInfoActivity extends AppCompatActivity {
public static final String TAG = CameraInfoActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_info);
getCameraInfo();
}
private void getCameraInfo() {
int numberOfCameras = Camera.getNumberOfCameras();
Log.i(TAG, "------------------------------ 摄像头个数:" + numberOfCameras);
for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
Log.i(TAG, "------------------------------ 后置摄像头,cameraId 为:" + cameraId);
} else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
Log.i(TAG, "------------------------------ 前置摄像头,cameraId 为:" + cameraId);
} else {
Log.i(TAG, "------------------------------ 其他摄像头,cameraId 为:" + cameraId);
}
Log.i(TAG, "---------- facing 为:" + cameraInfo.facing);
Log.i(TAG, "---------- orientation 为:" + cameraInfo.orientation);
Log.i(TAG, "---------- canDisableShutterSound 为:" + cameraInfo.canDisableShutterSound);
}
}
}
- 8 1<?xml version="1.0" encoding="utf-8"?>2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"3 xmlns:tools="http://schemas.android.com/tools"4 android:layout_width=“match_parent"5 android:layout_height=“match_parent"6 tools:context=”.fragment.TestBFragment”>78</androidx.constraintlayout.widget.ConstraintLayout>xml
I/CameraInfoActivity: ------------------------------ 摄像头个数:2
I/CameraInfoActivity: ------------------------------ 后置摄像头,cameraId 为:0
I/CameraInfoActivity: ---------- facing 为:0
I/CameraInfoActivity: ---------- orientation 为:90
I/CameraInfoActivity: ---------- canDisableShutterSound 为:true
I/CameraInfoActivity: ------------------------------ 前置摄像头,cameraId 为:1
I/CameraInfoActivity: ---------- facing 为:1
I/CameraInfoActivity: ---------- orientation 为:270
I/CameraInfoActivity: ---------- canDisableShutterSound 为:true
三、关于摄像头图像的自然方向
1、后置摄像头
-
后置摄像头(手机背后的) orientation 为 90
-
大多数 Android 设备的后置摄像头是横向安装的,因此相机传感器采集的图像需要旋转才能与屏幕方向一致
-
即需要顺时针旋转 90 度才能正确显示(调用 Camera 对象的 setDisplayOrientation 方法)
- 如下图示,这里我们定义箭头指向为摄像头的上方
2、前置摄像头
-
前置摄像头(手机屏幕上的) orientation 为 270
-
前置摄像头也是横向安装的,前置摄像头与后置摄像头的一个关键区别在于它在预览时会对图像进行镜像处理,即左右镜像处理把 orientation 为 270 处理成 orientation 为 90
-
这样也需要顺时针旋转 90 度才能正确显示(调用 Camera 对象的 setDisplayOrientation 方法)
- 如下图示,这里我们定义箭头指向为摄像头的上方