成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鴻蒙HarmonyOS相機的基本使用實戰

開發 前端 OpenHarmony
相機配置主要是設置預覽、拍照、錄像所需要用到的Surface(ohos.agp.graphics.Surface),沒有配置過Surface,相應的功能不能使用。

[[409325]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

相機開發流程


相機權限申請

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"

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<String> 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.     } 

相機設備創建

布局文件上添加按鈕:

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

按鈕的邏輯代碼:

  1. private void createCameraBtnFunc(Component component) { 
  2.     //openCamera(); //先測試創建相機 
  3.     initSurface(); //創建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.         //第一個參數cameraId 
  20.         //第二和第三個參數負責相機創建和相機運行時的數據和狀態檢測 
  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.         //創建相機成功的時候回調 
  30.     } 
  31.  
  32.     @Override 
  33.     public void onConfigured(Camera camera) { 
  34.  
  35.     } 

至此,相機設備的創建已經完成,執行成功意味著相機系統的硬件已經完成了上電。創建相機設備成功后,在CameraStateCallback中會觸發onCreated(Camera camera)回調,并且帶回Camera對象,用于執行相機設備的操作。當一個新的相機設備成功創建后,首先需要對相機進行配置,調用configure(CameraConfig)方法實現配置。

相機設備配置

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

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

  1. <DirectionalLayout 
  2.     ohos:id="$+id:surface_container" 
  3.     ohos:height="400vp" 
  4.     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后可以創建相機對象, 按鈕上點擊后執行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.  
  28.  
  29. //在上面的CameraStateCallbackImpl的onCreated方法中添加代碼 
  30. private Camera cameraDevice; 
  31. private Surface previewSurface; 
  32. private CameraConfig.Builder cameraConfigBuilder; //放前面 
  33. private final class CameraStateCallbackImpl extends CameraStateCallback { 
  34.     @Override 
  35.     public void onCreated(Camera camera) { 
  36.         //創建相機成功的時候回調 
  37.         cameraDevice = camera; 
  38.         previewSurface = surfaceProvider.getSurfaceOps().get().getSurface(); 
  39.         cameraConfigBuilder = camera.getCameraConfigBuilder(); 
  40.         if (cameraConfigBuilder == null) { 
  41.             System.out.println("onCreated cameraConfigBuilder is null"); 
  42.             return
  43.         } 
  44.         // 配置預覽的Surface 
  45.         cameraConfigBuilder.addSurface(previewSurface); 
  46.          
  47.         // 配置幀結果的回調 
  48.         cameraConfigBuilder.setFrameStateCallback(frameStateCallbackImpl, new EventHandler(EventRunner.create())); 
  49.         try { 
  50.             // 相機設備配置 
  51.             camera.configure(cameraConfigBuilder.build()); 
  52.         } catch (IllegalArgumentException e) { 
  53.             System.out.println("Argument Exception"); 
  54.         } catch (IllegalStateException e) { 
  55.             System.out.println("State Exception"); 
  56.         } 
  57.     } 
  58.  
  59. private FrameStateCallback frameStateCallbackImpl = new FrameStateCallback(){ 
  60.     //....更具需要實現接口里的方法 
  61. }; 

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

相機幀捕獲

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

通過triggerLoopingCapture(FrameConfig)方法實現循環幀捕獲實現預覽:

  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.         //配置成功的時候回調 
  8.         // 獲取預覽配置模板 
  9.         frameConfigBuilder = camera.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PREVIEW); 
  10.         // 配置預覽Surface 
  11.         frameConfigBuilder.addSurface(previewSurface); 
  12.         previewFrameConfig = frameConfigBuilder.build(); 
  13.         try { 
  14.             // 啟動循環幀捕獲 
  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.     } 

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

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

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

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

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

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

最后的效果:

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-09-13 15:17:28

鴻蒙HarmonyOS應用

2021-09-06 15:31:01

鴻蒙HarmonyOS應用

2021-09-27 10:43:18

鴻蒙HarmonyOS應用

2021-09-27 14:44:48

鴻蒙HarmonyOS應用

2021-01-11 11:04:49

鴻蒙HarmonyOS應用開發

2021-06-25 15:04:31

鴻蒙HarmonyOS應用

2020-11-10 10:00:10

HarmonyOS

2021-09-02 15:29:42

鴻蒙HarmonyOS應用

2021-07-14 05:55:12

鴻蒙HarmonyOS應用

2022-08-09 16:01:24

應用開發鴻蒙

2020-11-11 11:56:05

HarmonyOS

2020-11-20 13:53:40

hi3518

2024-07-26 16:17:22

2020-11-05 10:05:25

App

2021-08-26 15:28:05

鴻蒙HarmonyOS應用

2024-01-18 10:10:27

2021-05-19 08:41:11

鴻蒙HarmonyOS應用

2022-06-28 14:30:29

camera組件照片回傳

2021-01-14 09:50:26

鴻蒙HarmonyOSAPP

2020-12-03 12:06:54

HarmonyOS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人网| 欧美日韩在线高清 | 一区二区三区四区在线免费观看 | 精品视频网 | 欧美综合在线观看 | 国产伦精品一区二区三区精品视频 | 色av一区二区三区 | 成人免费视频网址 | 国产乱码精品一区二区三区中文 | 91免费电影| 在线观看免费av网 | 亚洲精品乱码久久久久久黑人 | 国产精品久久久久久婷婷天堂 | 国产偷录视频叫床高潮对白 | 一区二区av | 日韩一区二区三区在线观看视频 | 黄色一级免费 | 国产一区二区精 | av影片在线 | 精品一区二区三区在线观看 | 久久国产成人 | 午夜在线电影网 | 亚洲国产精品99久久久久久久久 | 国产91丝袜在线播放 | 国产在线观 | 日韩欧美大片 | 干狠狠| 亚洲欧美国产精品一区二区 | 97碰碰碰 | 国产激情视频在线免费观看 | 国产免费一级一级 | 国产网站久久 | 欧美国产一区二区 | 日韩在线播放视频 | 91大片 | 欧美日产国产成人免费图片 | 亚洲精品白浆高清久久久久久 | 欧美日韩不卡合集视频 | 久久国内| 51ⅴ精品国产91久久久久久 | 精品视频一区二区三区在线观看 |