La API y el conocimiento relacionado de la cámara se han descrito anteriormente, ahora explicaremos los ejemplos de la cámara.
El proceso más básico de usar la cámara para desarrollar una aplicación de cámara en Android:
- Utilice open(int cameraId) para obtener la instancia de la cámara.
- Establezca la clase de vista previa para la instancia de la cámara. Es un objeto SurfaceHolder y se establece mediante setPreviewDisplay (SurfaceHolder).
- Llame a startPreview() para comenzar a obtener una vista previa de la instancia de la cámara.
- Llame al método takePicture() para tomar una foto, en la que los datos de la imagen capturada se pueden obtener a través de la devolución de llamada Camera.PictureCallback().
- Cuando se completa la filmación, debe llamar a stopPreview () para detener la vista previa y usar release () para liberar los recursos ocupados por la cámara.
Los pasos anteriores son un proceso esencial. La cámara no tiene un constructor público. Solo puede obtener la instancia de la cámara a través del método open() y configurar una clase de vista previa de SurfaceHolder. Si este paso no se implementa, la cámara no será usado. Una vez completado el uso de la cámara, los recursos de la cámara deben liberarse mediante release(). A continuación se explicarán en detalle los ejemplos.
El siguiente ejemplo se divide en estos pasos:
- Configuración de permisos del sistema
- disposición de la cámara
- Configuración de vista previa de la cámara
- cámara tomando fotos
Configuración de permisos del sistema
// 相机权限
<uses-permission android:name="android.permission.CAMERA" />
// 文件读写权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 相机自动对焦配置
<uses-feature android:name="android.hardware.camera.autofocus" />
disposición de la cámara
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyCameraActivity">
<!--预览相机画面-->
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--两个按钮,取消和拍照-->
<LinearLayout
android:id="@+id/view_bottom_operate"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#FFF"
android:gravity="center"
android:orientation="horizontal"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/btn_cancle"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="center"
android:text="取消"
android:textColor="#000"
android:src="@mipmap/icon_cancle"
android:textSize="18sp" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/btn_take_picture"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="center"
android:text="点击拍照"
android:textColor="#000"
android:src="@mipmap/icon_take_picture"
android:textSize="18sp" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
android:textColor="#000"
android:textSize="18sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Configuración de vista previa de la cámara
La configuración de vista previa de la cámara primero debe obtener la cámara y el tamaño de vista previa de la cámara, y luego mostrar la pantalla de vista previa de la cámara a través de SurfaceView.
conseguir cámara
/**
* 获取相机实例
*
* @param cameraId 相机编号
* @param degrees 预览旋转角度
* @return
*/
private Camera getCamera(int cameraId, int degrees) {
if (null == mCamera) {
try {
mCamera = Camera.open(cameraId);
mCamera.setDisplayOrientation(degrees);
} catch (Exception e) {
}
}
return mCamera;
}
Obtenga el mejor tamaño de vista previa
1. Obtenga todas las resoluciones de vista previa admitidas por la cámara
// 获取相机支持的所有预览分辨率
List<Camera.Size> allSupportedSize =
mCamera.getParameters().getSupportedPreviewSizes();
2. Calcule la resolución adecuada para la vista previa.
Este paso es para obtener un tamaño de resolución máximo con la misma relación de resolución que SurfaceView, de modo que la foto no se deforme al obtener una vista previa y tomar fotografías.
/**
* 获取适合的分辨率
*
* @param camera camera实例
* @param rate 预览尺寸长宽比
* @return 获取
*/
private Camera.Size getSupportedPreviewSize(Camera camera, int rate) {
Camera.Parameters camPara = camera.getParameters();
List<Camera.Size> allSupportedSize = camPara.getSupportedPreviewSizes();
for (Camera.Size tmpSize : allSupportedSize) {
if (tmpSize.width / tmpSize.height == rate) {
return tmpSize;
}
}
return null;
}
3. Realizar vista previa de la cámara
La vista previa de la cámara se divide en tres pasos:
- Implementar la devolución de llamada de SurfaceHolder
- Establecer SurfaceHolder como control de visualización de la cámara
- Activar la vista previa de la cámara
private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
@Override
public boolean isCreating() {
return false;
}
@Override
public void addCallback(Callback callback) {
}
@Override
public void removeCallback(Callback callback) {
}
@Override
public void setFixedSize(int width, int height) {
}
@Override
public void setSizeFromLayout() {
}
@Override
public void setFormat(int format) {
}
@Override
public void setType(int type) {
}
@Override
public void setKeepScreenOn(boolean screenOn) {
}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect dirty) {
return null;
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {
}
@Override
public Surface getSurface() {
return null;
}
@Override
public Rect getSurfaceFrame() {
return null;
}
};
private void restartPreview(SurfaceHolder holder) {
if (camera != null) {
if (holder.getSurface() == null) {
return;
}
try {
camera.stopPreview();
} catch (Exception e) {
}
try {
// 将surfaceViewHolder设置为camera的显示控件
camera.setPreviewDisplay(holder);
// 开启相机预览
camera.startPreview();
if (listener != null) {
listener.onStartPreview();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Toma fotos
Para tomar una fotografía, solo necesita llamar a camera.takePicture().