日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
鴻蒙HarmonyOS相機的基本使用實戰(zhàn)

想了解更多內(nèi)容,請訪問:

月湖網(wǎng)站建設公司創(chuàng)新互聯(lián)建站,月湖網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為月湖上千余家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的月湖做網(wǎng)站的公司定做!

和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.

相機開發(fā)流程

相機權限申請

config.json

 
 
 
 
  1. "reqPermissions": [
  2.   {"name": "ohos.permission.CAMERA" },
  3.   { "name": "ohos.permission.WRITE_MEDIA"},
  4.   {"name": "ohos.permission.MICROPHONE"},
  5.   { "name": "ohos.permission.MEDIA_LOCATION"}
  6. ]

MainAbility

 
 
 
 
  1. @Override
  2. public void onStart(Intent intent) {
  3.     super.onStart(intent);
  4.     super.setMainRoute(MainAbilitySlice.class.getName());
  5.     requestPermissions();
  6. }
  7. private void requestPermissions() {
  8.     String[] permissions = {
  9.             SystemPermission.CAMERA,
  10.             SystemPermission.MICROPHONE,
  11.             SystemPermission.MEDIA_LOCATION,
  12.             SystemPermission.WRITE_MEDIA
  13.     };
  14.     List permissionFiltered = Arrays.stream(permissions)
  15.             .filter(permission -> verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED)
  16.             .collect(Collectors.toList());
  17.     requestPermissionsFromUser(permissionFiltered.toArray(new String[permissionFiltered.size()]), 0);
  18. }
  19. @Override
  20. public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
  21.     if (permissions == null || permissions.length == 0 || grantResults == null || grantResults.length == 0) {
  22.         return;
  23.     }
  24.     for (int grantResult : grantResults) {
  25.         if (grantResult != IBundleManager.PERMISSION_GRANTED) {
  26.             terminateAbility();
  27.             break;
  28.         }
  29.     }

相機設備創(chuàng)建

布局文件上添加按鈕:

 
 
 
 
  1.     ohos:id="$+id:create_camera_btn"
  2.     ohos:height="match_content"
  3.     ohos:width="300vp"
  4.     ohos:text="創(chuàng)建相機并配置"
  5.     ohos:text_size="20fp"
  6.     ohos:text_color="#ffffff"
  7.     ohos:background_element="#0000ff"
  8.     ohos:layout_alignment="horizontal_center"
  9.     ohos:top_padding="8vp"
  10.     ohos:bottom_padding="8vp"
  11.     ohos:left_padding="40vp"
  12.     ohos:right_padding="40vp"
  13.     ohos:top_margin="20vp"
  14.     />

按鈕的邏輯代碼:

 
 
 
 
  1. private void createCameraBtnFunc(Component component) {
  2.     //openCamera(); //先測試創(chuàng)建相機
  3.     initSurface(); //創(chuàng)建surface,里面包含的openCamera()
  4. }
  5. private void openCamera(){
  6.     System.out.println("createCameraBtnFunc start...");
  7.     CameraKit cameraKit = CameraKit.getInstance(getContext());
  8.     if(cameraKit == null){
  9.         System.out.println("cameraKit create error!");
  10.     }
  11.     System.out.println("cameraKit create success!"+cameraKit);
  12.     try {
  13.         // 獲取當前設備的邏輯相機列表
  14.         String[] cameraIds = cameraKit.getCameraIds();
  15.         if (cameraIds.length <= 0) {
  16.             System.out.println("cameraIds size is 0");
  17.         }
  18.         System.out.println("邏輯相機ids:" + Arrays.toString(cameraIds));
  19.         //第一個參數(shù)cameraId
  20.         //第二和第三個參數(shù)負責相機創(chuàng)建和相機運行時的數(shù)據(jù)和狀態(tài)檢測
  21.         cameraKit.createCamera(cameraIds[0], new CameraStateCallbackImpl(), new EventHandler(EventRunner.create("CameraCb")));
  22.     } catch (IllegalStateException e) {
  23.         // 處理異常
  24.     }
  25. }
  26. private class CameraStateCallbackImpl extends CameraStateCallback {
  27.     @Override
  28.     public void onCreated(Camera camera) {
  29.         //創(chuàng)建相機成功的時候回調(diào)
  30.     }
  31.     @Override
  32.     public void onConfigured(Camera camera) {
  33.     }
  34. }

至此,相機設備的創(chuàng)建已經(jīng)完成,執(zhí)行成功意味著相機系統(tǒng)的硬件已經(jīng)完成了上電。創(chuàng)建相機設備成功后,在CameraStateCallback中會觸發(fā)onCreated(Camera camera)回調(diào),并且?guī)Щ谻amera對象,用于執(zhí)行相機設備的操作。當一個新的相機設備成功創(chuàng)建后,首先需要對相機進行配置,調(diào)用configure(CameraConfig)方法實現(xiàn)配置。

相機設備配置

相機配置主要是設置預覽、拍照、錄像所需要用到的Surface(ohos.agp.graphics.Surface),沒有配置過Surface,相應的功能不能使用。為了進行相機幀捕獲結(jié)果的數(shù)據(jù)和狀態(tài)檢測,有時還需要在相機配置時調(diào)用setFrameStateCallback(FrameStateCallback, EventHandler)方法設置幀回調(diào)。相機配置成功后,在CameraStateCallback中會觸發(fā)onConfigured(Camera camera)回調(diào),然后才可以執(zhí)行相機幀捕獲相關的操作。

相機配置,布局文件上加一個布局:

 
 
 
 
  1.     ohos:id="$+id:surface_container"
  2.     ohos:height="400vp"
  3.     ohos:width="match_parent"/>

邏輯代碼:

 
 
 
 
  1. private SurfaceProvider surfaceProvider;
  2. private DirectionalLayout surfaceContainer; //定義在最前面
  3. private void initSurface() {
  4.     getWindow().setTransparent(true);
  5.     DirectionalLayout.LayoutConfig params = new DirectionalLayout.LayoutConfig(
  6.             ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);
  7.     surfaceProvider = new SurfaceProvider(this);
  8.     surfaceProvider.setLayoutConfig(params);
  9.     surfaceProvider.pinToZTop(false);
  10.     surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceCallBack());
  11.     surfaceContainer.addComponent(surfaceProvider);
  12. }
  13. private class SurfaceCallBack implements SurfaceOps.Callback {
  14.     @Override
  15.     public void surfaceCreated(SurfaceOps callbackSurfaceOps) {
  16.         //surfaceCreated后可以創(chuàng)建相機對象, 按鈕上點擊后執(zhí)行initSurface();
  17.         openCamera();
  18.     }
  19.     @Override
  20.     public void surfaceChanged(SurfaceOps callbackSurfaceOps, int format, int width, int height) {
  21.     }
  22.     @Override
  23.     public void surfaceDestroyed(SurfaceOps callbackSurfaceOps) {
  24.     }
  25. }
  26.  
  27. //在上面的CameraStateCallbackImpl的onCreated方法中添加代碼
  28. private Camera cameraDevice;
  29. private Surface previewSurface;
  30. private CameraConfig.Builder cameraConfigBuilder; //放前面
  31. private final class CameraStateCallbackImpl extends CameraStateCallback {
  32.     @Override
  33.     public void onCreated(Camera camera) {
  34.         //創(chuàng)建相機成功的時候回調(diào)
  35.         cameraDevice = camera;
  36.         previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
  37.         cameraConfigBuilder = camera.getCameraConfigBuilder();
  38.         if (cameraConfigBuilder == null) {
  39.             System.out.println("onCreated cameraConfigBuilder is null");
  40.             return;
  41.         }
  42.         // 配置預覽的Surface
  43.         cameraConfigBuilder.addSurface(previewSurface);
  44.         
  45.         // 配置幀結(jié)果的回調(diào)
  46.         cameraConfigBuilder.setFrameStateCallback(frameStateCallbackImpl, new EventHandler(EventRunner.create()));
  47.         try {
  48.             // 相機設備配置
  49.             camera.configure(cameraConfigBuilder.build());
  50.         } catch (IllegalArgumentException e) {
  51.             System.out.println("Argument Exception");
  52.         } catch (IllegalStateException e) {
  53.             System.out.println("State Exception");
  54.         }
  55.     }
  56. }
  57. private FrameStateCallback frameStateCallbackImpl = new FrameStateCallback(){
  58.     //....更具需要實現(xiàn)接口里的方法
  59. };

配置完成后,會回調(diào)public void onConfigured(Camera camera)方法,在這個方法里鋪貨相機拍攝的幀。

相機幀捕獲

用戶一般都是先看見預覽畫面才執(zhí)行拍照或者其他功能,所以對于一個普通的相機應用,預覽是必不可少的。通過getFrameConfigBuilder(FRAME_CONFIG_PREVIEW)方法獲取預覽配置模板,更多的幀配置項以及詳細使用方法請參考API接口說明的FrameConfig.Builder部分。

通過triggerLoopingCapture(FrameConfig)方法實現(xiàn)循環(huán)幀捕獲實現(xiàn)預覽:

 
 
 
 
  1. //在CameraStateCallbackImpl的onConfigured添加代碼
  2. private FrameConfig.Builder frameConfigBuilder;
  3. private FrameConfig previewFrameConfig;
  4. private final class CameraStateCallbackImpl extends CameraStateCallback {
  5.     @Override
  6.     public void onConfigured(Camera camera) {
  7.         //配置成功的時候回調(diào)
  8.         // 獲取預覽配置模板
  9.         frameConfigBuilder = camera.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PREVIEW);
  10.         // 配置預覽Surface
  11.         frameConfigBuilder.addSurface(previewSurface);
  12.         previewFrameConfig = frameConfigBuilder.build();
  13.         try {
  14.             // 啟動循環(huán)幀捕獲
  15.             int triggerId = camera.triggerLoopingCapture(previewFrameConfig);
  16.         } catch (IllegalArgumentException e) {
  17.             System.out.println("Argument Exception");
  18.         } catch (IllegalStateException e) {
  19.             System.out.println("State Exception");
  20.         }
  21.     }
  22. }

經(jīng)過以上的操作,相機應用已經(jīng)可以正常進行實時預覽了。在預覽狀態(tài)下,開發(fā)者還可以執(zhí)行其他操作,比如:當預覽幀配置更改時,可以通過triggerLoopingCapture(FrameConfig)方法實現(xiàn)預覽幀配置的更新。

 
 
 
 
  1.     ohos:id="$+id:change_camera_config_btn"
  2.     ohos:height="match_content"
  3.     ohos:width="300vp"
  4.     ohos:text="改變相機焦距配置"
  5.     ohos:text_size="20fp"
  6.     ohos:text_color="#ffffff"
  7.     ohos:background_element="#0000ff"
  8.     ohos:layout_alignment="horizontal_center"
  9.     ohos:top_padding="8vp"
  10.     ohos:bottom_padding="8vp"
  11.     ohos:left_padding="40vp"
  12.     ohos:right_padding="40vp"
  13.     ohos:top_margin="20vp"
  14.     />
 
 
 
 
  1. //改變相機焦距配置
  2. private void changeCameraConfigBtnFunc(Component component) {
  3.     // 預覽幀變焦值變更
  4.     frameConfigBuilder.setZoom(1.5f);
  5.     // 調(diào)用triggerLoopingCapture方法實現(xiàn)預覽幀配置更新
  6.     cameraDevice.triggerLoopingCapture(frameConfigBuilder.build());
  7. }

通過stopLoopingCapture()方法停止循環(huán)幀捕獲(停止預覽)。

 
 
 
 
  1.     ohos:id="$+id:stop_camera_preview_btn"
  2.     ohos:height="match_content"
  3.     ohos:width="300vp"
  4.     ohos:text="停止相機預覽"
  5.     ohos:text_size="20fp"
  6.     ohos:text_color="#ffffff"
  7.     ohos:background_element="#0000ff"
  8.     ohos:layout_alignment="horizontal_center"
  9.     ohos:top_padding="8vp"
  10.     ohos:bottom_padding="8vp"
  11.     ohos:left_padding="40vp"
  12.     ohos:right_padding="40vp"
  13.     ohos:top_margin="20vp"
  14.     />
 
 
 
 
  1. //停止相機預覽
  2. private void stopCameraBtnFunc(Component component) {
  3.     // 停止預覽幀捕獲
  4.     cameraDevice.stopLoopingCapture();
  5. }

到這里相機的基本用戶流程,基本搞清楚,使用相機最后一步就是釋放了。

 
 
 
 
  1.     ohos:id="$+id:release_camera_btn"
  2.     ohos:height="match_content"
  3.     ohos:width="300vp"
  4.     ohos:text="釋放相機"
  5.     ohos:text_size="20fp"
  6.     ohos:text_color="#ffffff"
  7.     ohos:background_element="#0000ff"
  8.     ohos:layout_alignment="horizontal_center"
  9.     ohos:top_padding="8vp"
  10.     ohos:bottom_padding="8vp"
  11.     ohos:left_padding="40vp"
  12.     ohos:right_padding="40vp"
  13.     ohos:top_margin="20vp"
  14.     />
 
 
 
 
  1. private void releaseCameraBtnFunc(Component component) {
  2.     if (cameraDevice != null) {
  3.         // 關閉相機和釋放資源
  4.         cameraDevice.release();
  5.         cameraDevice = null;
  6.     }
  7.     // 預覽配置模板置空
  8.     previewFrameConfig = null;
  9. }

最后的效果:

想了解更多內(nèi)容,請訪問:

和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.


網(wǎng)站標題:鴻蒙HarmonyOS相機的基本使用實戰(zhàn)
URL標題:http://www.5511xx.com/article/dhcihoi.html