Hongmengアプリケーション開発メディア(カメラ)

I.概要

HarmonyOSカメラモジュールは、カメラサービスの開発をサポートします。開発者は、オープンインターフェイスを介して、カメラハードウェアへのアクセス、操作、および新機能の開発を実装できます。最も一般的な操作には、プレビュー、写真の撮影、連続撮影、ビデオ録画が含まれます。

1.基本的な考え方

  • カメラの静的機能

    向き、サポートされている解像度、その他の情報など、カメラの固有の機能を説明するために使用される一連のパラメーター。

  • 物理カメラ

    物理カメラは、独立した物理カメラデバイスです。物理カメラIDは、各物理カメラを識別するために使用される一意の文字列です。

  • 論理カメラ

    論理カメラは、複数の物理カメラで構成される抽象的なデバイスです。論理カメラは、複数の物理カメラデバイスを同時に制御することにより、大口径、ズームなどのカメラの特定の機能を完了します。論理カメラIDは、複数の物理カメラの抽象的な機能を識別する一意の文字列です。

  • フレームキャプチャ

    カメラ起動後のフレームのキャプチャを総称してフレームキャプチャと呼びます。これには主に、シングルフレームキャプチャ、マルチフレームキャプチャ、およびループフレームキャプチャが含まれます。

  • シングルフレームキャプチャ

    これは、カメラが起動した後のフレームデータストリーム内のデータフレームのキャプチャを指します。これは、通常の写真撮影でよく使用されます。

  • マルチフレームキャプチャ

    これは、カメラの起動後にフレームデータストリーム内の複数のデータフレームを連続的にキャプチャすることを指し、連続撮影によく使用されます。

  • ループフレームキャプチャ

    これは、カメラの起動後、フレームデータが常にフレームデータストリームにキャプチャされることを意味します。これは、プレビューや記録によく使用されます。

2.制限と制限

  • 同時に実行できるカメラアプリケーションは1つだけです。
  • カメラモジュール内には状態制御があり、開発者はガイドドキュメントのプロセスに従って順番にインターフェースを呼び出す必要があります。そうしないと、呼び出しの失敗などの問題が発生する可能性があります。
  • 互換性の高いカメラアプリケーションを開発するために、カメラオブジェクトやパラメータ関連の設定を作成する前に、必ず機能を確認してください。

3.開発プロセス

img

2.開発前のいくつかの指示と必要な手順

1.3つの重要なインターフェース

パッケージ名 特徴
ohos.media.camera.CameraKit カメラ機能エントリークラス。現在サポートされているカメラとその静的機能情報のリストを取得し、カメラオブジェクトを作成します。
ohos.media.camera.device カメラ機器操作クラス。カメラ機能クエリ、カメラ構成、カメラフレームキャプチャ、カメラステータスコールバックなどの機能を提供します。
ohos.media.camera.params カメラパラメータクラス。カメラの属性、パラメーター、および操作結果の定義を提供します。

2.許可申請

カメラには次の4つの権限が含まれます

機関名 権限属性値 必須ですか
カメラの許可 ohos.permission.CAMERA 必須
録音許可 ohos.permission.MICROPHONE オプション(録音が必要な場合に適用)
ストレージ権限 ohos.permission.WRITE_USER_STORAGE オプション(画像やビデオをデバイスの外部ストレージに保存する必要がある場合に適用)
場所のアクセス許可 ohos.permission.LOCATION オプション(画像とビデオの位置情報を保存する必要がある場合に適用)

構成ファイルでアクセス許可を宣言します。この図は便利です。上記の4つのアクセス許可をすべて要求したのでDemo、1つずつ追加する必要はありません。

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

画像-20210120141535344

要求許可での方法MainAbilityOnStart

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);
    }
}

画像-20210120142147059

第三に、カメラ機器の作成

CameraKitクラスはカメラのエントリクラスでAPIあり、カメラデバイスの特性を取得してカメラを開くために使用されます。

インターフェイス名 説明
createCamera(String cameraId、CameraStateCallbackコールバック、EventHandlerハンドラー) カメラオブジェクトを作成します。
getCameraAbility(String cameraId) 指定された論理カメラまたは物理カメラの静的機能を取得します。
getCameraIds() 現在の論理カメラリストを取得します。
getCameraInfo(String cameraId) 指定した論理カメラの情報を取得します。
getInstance(コンテキストコンテキスト) CameraKitのインスタンスを取得します。
registerCameraDeviceCallback(CameraDeviceCallbackコールバック、EventHandlerハンドラー) カメラ使用状況コールバックを登録します。
unregisterCameraDeviceCallback(CameraDeviceCallbackコールバック) カメラの使用状況のコールバックをログアウトします。

HarmonyOSカメラアプリケーションの実現に基づいて、将来どのデバイスに適用するかに関係なく、他のカメラ操作を続行する前に、まず独立したカメラデバイスを作成する必要があります。

処理する

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);
    }
}

試験結果

画像-20210120160516119

失敗?

1時間以上調整しても機能せず、参考資料もありません。ホンメンはどのように学ぶことができますか?

より多くのためにとどまり、学習をやめなさい。

おすすめ

転載: blog.csdn.net/qq_43509535/article/details/112887256