Notas de estudio de Android --- Cámara (2)

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().

Supongo que te gusta

Origin blog.csdn.net/HaveFun_Wine/article/details/129821362
Recomendado
Clasificación