Notas de estudio de Android---Cámara

La API y el conocimiento relacionado de la cámara se han descrito anteriormente, y explicaremos los ejemplos de la cámara a continuación.

Android usa la cámara para desarrollar el proceso más básico de tomar fotografías:

  • Use open(int cameraId) para obtener la instancia de la cámara.
  • Establezca la clase de vista previa para la instancia de la cámara, que es un objeto SurfaceHolder, establecido por setPreviewDisplay(SurfaceHolder).
  • Llame a startPreview() para iniciar la vista previa de la instancia de la cámara
  • Llame al método takePicture() para tomar una foto, y los datos de la imagen capturada se pueden obtener a través de la devolución de llamada Camera.PictureCallback().
  • Cuando se completa el disparo, 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, y la instancia de la cámara solo se puede obtener a través del método open(), y se establece una clase de vista previa de superficie. Si este paso no se implementa, la cámara no se podrá usar. Después de usar la cámara, se debe usar release() para liberar los recursos de la cámara. Los siguientes ejemplos se explican en detalle.

El siguiente ejemplo se divide en estos pasos:

  • Configuración de permisos del sistema
  • diseño de la cámara
  • Configuración de vista previa de la cámara
  • cámara para tomar 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" />

diseño 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 debe obtener primero 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 una 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 compatibles con 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áxima con la misma relación de resolución que SurfaceView, para que la foto no se deforme al previsualizar 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. Realice una 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 el SurfaceHolder como el 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 fotografías

Para tomar una foto, solo necesita llamar a camera.takePicture().

Supongo que te gusta

Origin blog.csdn.net/xiaowang_lj/article/details/131822890
Recomendado
Clasificación