Medios de desarrollo de aplicaciones de Hongmeng (cámara)

I. Resumen

HarmonyOSEl módulo de la cámara admite el desarrollo de servicios de cámara. Los desarrolladores pueden implementar el acceso al hardware de la cámara, la operación y el desarrollo de nuevas funciones a través de interfaces abiertas. Las operaciones más comunes incluyen la vista previa, la toma de fotografías, el disparo continuo y la grabación de video.

1. Conceptos básicos

  • Capacidad estática de la cámara

    Una serie de parámetros que se utilizan para describir las capacidades inherentes de la cámara, como la orientación, las resoluciones admitidas y otra información.

  • Cámara física

    Una cámara física es un dispositivo de cámara física independiente. La cámara física IDes una cadena única que se utiliza para identificar cada cámara física.

  • Cámara lógica

    Una cámara lógica es un dispositivo abstracto compuesto por múltiples cámaras físicas. La cámara lógica completa ciertas funciones de la cámara, como gran apertura, zoom, etc., controlando múltiples dispositivos de cámara física al mismo tiempo. Una cámara lógica IDes una cadena única que identifica las capacidades abstractas de varias cámaras físicas.

  • Captura de fotogramas

    La captura de fotogramas una vez iniciada la cámara se denomina en conjunto captura de fotogramas. Incluye principalmente captura de un solo cuadro, captura de múltiples cuadros y captura de cuadro en bucle.

  • Captura de un solo cuadro

    Se refiere a la captura de un cuadro de datos en el flujo de datos del cuadro después de que se inicia la cámara, que a menudo se utiliza para fotografías normales.

  • Captura de fotogramas múltiples

    Se refiere a la captura continua de varios fotogramas de datos en el flujo de datos del fotograma después de que se inicia la cámara, que a menudo se utiliza para disparos continuos.

  • Captura de cuadros en bucle

    Significa que después de que se inicia la cámara, los datos del cuadro siempre se capturan en el flujo de datos del cuadro, que a menudo se usa para previsualizar y grabar.

2. Restricciones y limitaciones

  • Solo se puede ejecutar una aplicación de cámara al mismo tiempo.
  • Hay control de estado dentro del módulo de la cámara, y el desarrollador debe llamar a las interfaces en orden de acuerdo con el proceso en el documento de guía, de lo contrario pueden ocurrir problemas como fallas en la llamada.
  • Para desarrollar aplicaciones de cámara con una mejor compatibilidad, asegúrese de verificar las capacidades antes de crear objetos de cámara o configuraciones relacionadas con parámetros.

3. Proceso de desarrollo

img

2. Algunas instrucciones y pasos necesarios antes del desarrollo

1. Tres interfaces importantes

Nombres de paquetes Caracteristicas
ohos.media.camera.CameraKit Clase de entrada de función de cámara. Obtenga la lista de cámaras compatibles actualmente y su información de capacidad estática, y cree un objeto de cámara.
ohos.media.camera.device Clase de operación del equipo de cámara. Proporciona funciones como consulta de capacidad de cámara, configuración de cámara, captura de fotogramas de cámara y devolución de llamada del estado de la cámara.
ohos.media.camera.params Clase de parámetro de cámara. Proporcione definiciones de los atributos, parámetros y resultados operativos de la cámara.

2. Solicitud de permiso

La cámara implica los siguientes cuatro permisos

Nombre de la autoridad Valor de atributo de permiso Es obligatorio
Permisos de la cámara ohos.permission.CAMERA necesario
Permiso de grabación ohos.permission.MICROPHONE Opcional (aplicar cuando se requiera grabación)
Permisos de almacenamiento ohos.permission.WRITE_USER_STORAGE Opcional (aplicar cuando necesite guardar imágenes y videos en el almacenamiento externo del dispositivo)
Permisos de ubicación ohos.permission.LOCATION Opcional (aplique cuando necesite guardar la imagen y la información de ubicación del video)

Declare los permisos en el archivo de configuración. El diagrama aquí es conveniente. He solicitado los cuatro permisos anteriores, por lo que Demono necesito agregarlos uno por uno.

"reqPermissions": [
  {
    
    
    "name": "ohos.permission.CAMERA",
    "name": "ohos.permission.MICROPHONE",
    "name": "ohos.permission.LOCATION",
    "name": "ohos.permission.WRITE_USER_STORAGE"
  }

imagen-20210120141535344

Solicitar permiso en MainAbilityel OnStartmétodo

public class MainAbility extends Ability {
    
    
    @Override
    public void onStart(Intent intent) {
    
    
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        String[] permissions = {
    
    "ohos.permission.CAMERA"
                , "ohos.permission.MICROPHONE"
                , "ohos.permission.LOCATION"
                , "ohos.permission.WRITE_USER_STORAGE"};
        requestPermissionsFromUser(permissions, 0);
    }
}

imagen-20210120142147059

En tercer lugar, la creación de equipos de cámara.

CameraKitLa clase es la clase de entrada de la cámara API, que se utiliza para obtener las características del dispositivo de la cámara y abrir la cámara.

Nombre de la interfaz descripción
createCamera (String cameraId, devolución de llamada CameraStateCallback, controlador EventHandler) Crea objetos de cámara.
getCameraAbility (String cameraId) Obtenga las capacidades estáticas de la cámara lógica o física especificada.
getCameraIds () Obtenga la lista de cámaras lógicas actual.
getCameraInfo (String cameraId) Obtenga la información de la cámara lógica especificada.
getInstance (contexto de contexto) Obtenga una instancia de CameraKit.
registerCameraDeviceCallback (devolución de llamada CameraDeviceCallback, controlador EventHandler) Registre la devolución de llamada del estado de uso de la cámara.
unregisterCameraDeviceCallback (devolución de llamada de CameraDeviceCallback) Cierre la sesión de devolución de llamada del estado de uso de la cámara.

Según la HarmonyOSrealización de una aplicación de cámara, no importa a qué dispositivo o dispositivos desee aplicar en el futuro, primero debe crear un dispositivo de cámara independiente antes de poder continuar con otras operaciones de la cámara.

Proceso

public class MainAbilitySlice extends AbilitySlice {
    
    
    private static HiLogLabel hiLogLabel = new HiLogLabel(3, 1, "MainAbility");
    private EventHandler eventHandler = new EventHandler(EventRunner.create("CameraCb"));
    private CameraStateCallback cameraStateCallback = new CameraStateCallback() {
    
    
        @Override
        public void onCreated(Camera camera) {
    
    
            super.onCreated(camera);
            HiLog.info(hiLogLabel, "创建相机设备");
        }

        @Override
        public void onCreateFailed(String cameraId, int errorCode) {
    
    
            super.onCreateFailed(cameraId, errorCode);
            HiLog.info(hiLogLabel, "创建相机设备失败,cameraId = " + cameraId + ",errorCode = " + errorCode);
        }

        @Override
        public void onConfigured(Camera camera) {
    
    
            super.onConfigured(camera);
            HiLog.info(hiLogLabel, "配置相机设备");
        }

        @Override
        public void onPartialConfigured(Camera camera) {
    
    
            super.onPartialConfigured(camera);
            HiLog.info(hiLogLabel, "使用了addDeferredSurfaceSize配置了相机");

        }

        @Override
        public void onConfigureFailed(Camera camera, int errorCode) {
    
    
            super.onConfigureFailed(camera, errorCode);
            HiLog.info(hiLogLabel, "配置相机设备失败");

        }

        @Override
        public void onReleased(Camera camera) {
    
    
            super.onReleased(camera);
            HiLog.info(hiLogLabel, "释放相机设备");

        }

        @Override
        public void onFatalError(Camera camera, int errorCode) {
    
    
            super.onFatalError(camera, errorCode);
            HiLog.info(hiLogLabel, "onFatalError错误");
        }

        @Override
        public void onCaptureRun(Camera camera) {
    
    
            super.onCaptureRun(camera);
            HiLog.info(hiLogLabel, "onCaptureRun错误");
        }

        @Override
        public void onCaptureIdle(Camera camera) {
    
    
            super.onCaptureIdle(camera);
            HiLog.info(hiLogLabel, "onCaptureIdle错误");
        }
    };
    private Button mBtn1;

    @Override
    public void onStart(Intent intent) {
    
    
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        String[] permissions = {
    
    "ohos.permission.CAMERA"
                , "ohos.permission.MICROPHONE"
                , "ohos.permission.LOCATION"
                , "ohos.permission.WRITE_USER_STORAGE"};
        requestPermissionsFromUser(permissions, 0);
        mBtn1 = (Button) findComponentById(ResourceTable.Id_btn1);
        mBtn1.setClickedListener(component -> {
    
    
            createCamera();
        });
    }

    /**
     * @description 测试创建相机设备
     * @author PengHuAnZhi
     * @date 2021/1/20 14:28
     */
    private void createCamera() {
    
    
        /*获取唯一的CameraKit对象是创建新的相机应用的第一步操作*/
        CameraKit cameraKit = CameraKit.getInstance(this.getContext());
        /*如果此步骤操作失败,相机可能被占用或无法使用。如果被占用,必须等到相机释放后才能重新获取CameraKit对象*/
        if (cameraKit != null) {
    
    
            try {
    
    
                String[] cameraIds = cameraKit.getCameraIds();
                if (cameraIds.length <= 0) {
    
    
                    HiLog.info(hiLogLabel, "设备无可用相机设备!");
                } else {
    
    
                    //遍历设备有可以用的相机设备
                    for (String id : cameraIds) {
    
    
                        //相机硬件信息
                        CameraInfo cameraInfo = cameraKit.getCameraInfo(id);
                        //获取相机朝向信息
                        int facingType = cameraInfo.getFacingType();
                        //获取逻辑相机ID。
                        String logicalId = cameraInfo.getLogicalId();
                        List<String> physicalIdList = cameraInfo.getPhysicalIdList();
                        HiLog.info(hiLogLabel, "id = " + id + ",朝向信息为" + facingType + ",逻辑相机id = " + logicalId);
                        HiLog.info(hiLogLabel, "对应的物理相机id列表如下");
                        for (String str : physicalIdList) {
    
    
                            //获取物理相机连接方式
                            int deviceLinkType = cameraInfo.getDeviceLinkType(str);
                            HiLog.info(hiLogLabel, "物理相机id = " + str + ",连接方式 = " + deviceLinkType);
                        }
                        //相机能力信息(比如支持的分辨率列表等)。
                        CameraAbility cameraAbility = cameraKit.getCameraAbility(id);
                        /*CameraAbility类下的API更多,需要就上官方文档查吧,这里只示范一个*/
                        //获取当前相机支持的闪光灯取值范围
                        int[] supportedFlashMode = cameraAbility.getSupportedFlashMode();
                        HiLog.info(hiLogLabel, "闪光灯取值范围为 = " + Arrays.toString(supportedFlashMode));
                        HiLog.info(hiLogLabel, "---------------------------------");
                    }
                    if (cameraStateCallback == null) {
    
    
                        HiLog.info(hiLogLabel, "cameraStateCallback为Null!");
                    }
                    if (eventHandler == null) {
    
    
                        HiLog.info(hiLogLabel, "eventHandler为Null!");
                    }
                    /*第一个参数cameraId可以是上一步获取的逻辑相机列表中的任何一个相机ID。第二和第三个参数负责相机创建和相机运行时的数据和状态检测,务必保证在整个相机运行周期内有效。*/
                    cameraKit.createCamera(cameraIds[0], cameraStateCallback, eventHandler);
                }
            } catch (Exception e) {
    
    
                HiLog.info(hiLogLabel, "获取设备支持的逻辑相机列表错误");
            }
        } else {
    
    
            HiLog.info(hiLogLabel, "获取CameraKit失败了");
        }
    }

    @Override
    public void onActive() {
    
    
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
    
    
        super.onForeground(intent);
    }
}

Resultados de la prueba

imagen-20210120160516119

¿fracaso? ?

Después de ajustar durante más de una hora, todavía no funciona y no hay material de referencia ¿Cómo puede aprender Hongmeng? ? ? ? ? ? ?

Quédate por más, deja de aprender.

Supongo que te gusta

Origin blog.csdn.net/qq_43509535/article/details/112887256
Recomendado
Clasificación