色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙實(shí)戰(zhàn)開發(fā):【相機(jī)和媒體庫】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-20 16:36 ? 次閱讀

介紹

在ArkTS中調(diào)用相機(jī)拍照和錄像,以及如何使用媒體庫接口進(jìn)行媒體文件的增、刪、改、查操作。本示例用到了

  • 權(quán)限管理能力
  • 相機(jī)模塊能力接口
  • 圖片處理接口
  • 音視頻相關(guān)媒體業(yè)務(wù)能力接口
  • 媒體庫管理接口
  • 設(shè)備信息能力接口
  • 文件存儲管理能力接口
  • 彈窗能力接口

效果預(yù)覽

image.png

使用說明

1.啟動應(yīng)用,在權(quán)限彈窗中授權(quán)后返回應(yīng)用,首頁顯示當(dāng)前設(shè)備的相冊信息,首頁監(jiān)聽相冊變化會刷新相冊列表。

2.點(diǎn)擊 + 按鈕,彈出相機(jī)、錄音、文本文件三個圖標(biāo)。

3.安裝相機(jī)應(yīng)用[Camera]應(yīng)用后,點(diǎn)擊相機(jī)圖標(biāo),進(jìn)入相機(jī)界面,默認(rèn)是拍照模式,點(diǎn)擊底部拍照按鈕可以拍照,拍照完成會在底部左側(cè)顯示照片預(yù)覽圖。點(diǎn)擊錄像切換到錄像模式,點(diǎn)擊底部按鈕開始錄像,點(diǎn)擊結(jié)束按鈕結(jié)束錄像,結(jié)束錄像后底部左側(cè)顯示視頻圖標(biāo)。點(diǎn)擊系統(tǒng)Back鍵或界面頂部返回按鈕返回首頁。

4.點(diǎn)擊錄音圖標(biāo)進(jìn)入錄音界面,點(diǎn)擊右側(cè)開始按鈕開始錄音,按鈕變?yōu)闀和0粹o,點(diǎn)擊可以暫停和繼續(xù)錄音,點(diǎn)擊左側(cè)結(jié)束按鈕結(jié)束錄音返回首頁。

5.點(diǎn)擊文本圖標(biāo)進(jìn)入文本編輯界面,輸入文本內(nèi)容后點(diǎn)擊Save按鈕,會創(chuàng)建并寫入文本文件,完成后返回首頁。

6.點(diǎn)擊相冊進(jìn)入文件列表界面,展示相冊內(nèi)的文件,列表中有刪除重命名按鈕,點(diǎn)擊可以刪除文件和重命名文件。

7.安裝視頻播放[VideoPlayer]應(yīng)用后,點(diǎn)擊視頻文件可以調(diào)起視頻播放界面播放該視頻。

相關(guān)概念

媒體庫管理:媒體庫管理提供接口對公共媒體資源文件進(jìn)行管理,包括文件的增、刪、改、查等。 相機(jī):相機(jī)模塊支持相機(jī)相關(guān)基礎(chǔ)功能的開發(fā),主要包括預(yù)覽、拍照、錄像等。

工程目錄

entry/src/main/ets/
|---MainAbility
|   |---MainAbility.ts                      // 主程序入口,應(yīng)用啟動時獲取相應(yīng)權(quán)限
|---pages
|   |---index.ets                           // 首頁
|   |---AlbumPage.ets                       // 相冊頁面
|   |---CameraPage.ets                      // 相機(jī)頁面
|   |---RecordPage.ets                      // 錄音頁面
|   |---DocumentPage.ets                    // 存儲文件頁面
|---model                                  
|   |---CameraService.ts                    // 相機(jī)模塊(拍照錄像模式)
|   |---DateTimeUtil.ts                     // 日期工具包
|   |---MediaUtils.ts                       // 媒體工具模塊
|   |---RecordModel.ts                      // 錄音模塊(底層能力實(shí)現(xiàn))
|   |---TimeUtils.ts                        // 時間工具包
|---view                                    
|   |---BasicDataSource.ets                 // 初始化媒體服務(wù)數(shù)組
|   |---MediaItem.ets                       // 定義具體的某一媒體模塊頁面 
|   |---MediaView.ets                       // 媒體模塊的前置模塊(判斷是否有展示的媒體內(nèi)容)
|   |---RenameDialog.ets                    // 重命名文件模塊 
|   |---TitleBar.ets                        // 標(biāo)題欄

具體實(shí)現(xiàn)

  • 布局原理:定義@ObjectLink 裝飾的數(shù)組變量album存放資源文件,使用list()組件中ListItem()循環(huán)數(shù)組展示,加號Button(),點(diǎn)擊后觸發(fā) animateTo({ duration: 500, curve: Curve.Ease })控制動畫展示,[源碼參考]。
/*

 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import mediaLibrary from '@ohos.multimedia.mediaLibrary';

import common from '@ohos.app.ability.common';

import Want from '@ohos.app.ability.Want';

import router from '@ohos.router';

import TitleBar from '../view/TitleBar';

import MediaUtils from '../model/MediaUtils';

import { MediaView } from '../view/MediaView';

import Logger from '../model/Logger';



@Observed

export default class Album {

  constructor(public albumName: string, public count: number, public mediaType?: mediaLibrary.MediaType) {

    this.albumName = albumName;

    this.count = count;

    this.mediaType = mediaType;

  }

}



@Entry

@Component

struct Index {

  private mediaUtils: MediaUtils = MediaUtils.getInstance(getContext(this))

  @State albums: Array< Album > = []

  @State selectIndex: number = 0

  @State operateVisible: boolean = false



  async onPageShow() {

    this.albums = [];

    this.albums = await this.mediaUtils.getAlbums();

  }



  @Builder OperateBtn(src, zIndex, translate, handleClick) {

    Button() {

      Image(src)

        .width('70%')

        .height('70%')

    }

    .type(ButtonType.Circle)

    .width('40%')

    .height('40%')

    .backgroundColor('#0D9FFB')

    .zIndex(zIndex)

    .translate({ x: translate.x, y: translate.y })

    .transition({ type: TransitionType.Insert, translate: { x: 0, y: 0 } })

    .transition({ type: TransitionType.Delete, opacity: 0 })

    .onClick(handleClick)

  }



  build() {

    Stack({ alignContent: Alignment.BottomEnd }) {

      Column() {

        TitleBar()

        List() {

          ForEach(this.albums, (item: Album, index) = > {

            ListItem() {

              MediaView({ album: item })

                .id(`mediaType${index}`)

            }

          }, item = > item.albumName)

        }

        .divider({ strokeWidth: 1, color: Color.Gray, startMargin: 16, endMargin: 16 })

        .layoutWeight(1)

      }

      .width('100%')

      .height('100%')



      Stack({ alignContent: Alignment.Center }) {

        Button() {

          Image($r('app.media.add'))

            .width('100%')

            .height('100%')

        }

        .width(60)

        .height(60)

        .padding(10)

        .id('addBtn')

        .type(ButtonType.Circle)

        .backgroundColor('#0D9FFB')

        .onClick(() = > {

          animateTo({ duration: 500, curve: Curve.Ease }, () = > {

            this.operateVisible = !this.operateVisible

          })

        })



        Button() {

          Image($r('app.media.icon_camera'))

            .id('camera')

            .width('100%')

            .height('100%')

        }

        .width(60)

        .height(60)

        .padding(10)

        .type(ButtonType.Circle)

        .backgroundColor('#0D9FFB')

        .translate({ x: 0, y: -80 })

        .visibility(this.operateVisible ? Visibility.Visible : Visibility.None)

        .onClick(() = > {

          this.operateVisible = !this.operateVisible;

          let context: common.UIAbilityContext | undefined = AppStorage.Get('context');

          let want: Want = {

            bundleName: "com.samples.camera_page",

            abilityName: "EntryAbility",

          };

          context && context.startAbility(want,  (err) = > {

            if (err.code) {

              Logger.error('StartAbility', `Failed to startAbility. Code: ${err.code}, message: ${err.message}`);

            }

          });

        })



        Button() {

          Image($r('app.media.icon_record'))

            .id('record')

            .width('100%')

            .height('100%')

        }

        .width(60)

        .height(60)

        .padding(10)

        .type(ButtonType.Circle)

        .backgroundColor('#0D9FFB')

        .translate({ x: -80, y: 0 })

        .visibility(this.operateVisible ? Visibility.Visible : Visibility.None)

        .onClick(() = > {

          this.operateVisible = !this.operateVisible

          router.push({ url: 'pages/RecordPage' })

        })



        Button() {

          Image($r('app.media.icon_document'))

            .width('100%')

            .height('100%')

        }

        .width(60)

        .height(60)

        .padding(10)

        .id('document')

        .type(ButtonType.Circle)

        .backgroundColor('#0D9FFB')

        .translate({ x: 0, y: 80 })

        .visibility(this.operateVisible ? Visibility.Visible : Visibility.None)

        .onClick(() = > {

          this.operateVisible = !this.operateVisible

          router.pushUrl({ url: 'pages/DocumentPage' })

        })

      }

      .width(180)

      .height(220)

      .margin({ right: 40, bottom: 120 })

    }

    .width('100%')

    .height('100%')

  }



  aboutToDisappear() {

    this.mediaUtils.offDateChange()

  }

}
  • 獲取資源文件:通過引入媒體庫實(shí)例(入口)接口@ohos.multimedia.medialibrary,例如通過this.getFileAssetsFromType(mediaLibrary.MediaType.FILE)獲取FILE類型的文件資源,并通過albums.push()添加至album數(shù)組中。
  • 展示系統(tǒng)資源文件:當(dāng)album內(nèi)的值被修改時,只會讓用 @ObjectLink 裝飾的變量album所在的組件被刷新,當(dāng)前組件不會刷新。
  • 錄音功能:通過引入音視頻接口@ohos.multimedia.media,例如通過media.createAudioRecorder()創(chuàng)建音頻錄制的實(shí)例來控制音頻的錄制,通過this.audioRecorder.on('prepare', () => {this.audioRecorder.start()})異步方式開始音頻錄制,[源碼參考]
/*

 * Copyright (c) 2022 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

import media from '@ohos.multimedia.media'

import Logger from '../model/Logger'



let audioConfig = {

  audioSourceType: 1,

  audioEncoder: 3,

  audioEncodeBitRate: 22050,

  audioSampleRate: 22050,

  numberOfChannels: 2,

  format: 6,

  uri: ''

}



export default class RecordModel {

  private tag: string = 'RecordModel'

  private audioRecorder: media.AudioRecorder = undefined



  initAudioRecorder(handleStateChange: () = > void) {

    this.release();

    this.audioRecorder = media.createAudioRecorder()

    Logger.info(this.tag, 'create audioRecorder success')

    this.audioRecorder.on('prepare', () = > {

      Logger.info(this.tag, 'setCallback  prepare case callback is called')

      this.audioRecorder.start()

    })

    this.audioRecorder.on('start', () = > {

      Logger.info(this.tag, 'setCallback start case callback is called')

      handleStateChange()

    })

    this.audioRecorder.on('stop', () = > {

      Logger.info(this.tag, 'audioRecorder stop called')

      this.audioRecorder.release()

    })

    this.audioRecorder.on('pause', () = > {

      Logger.info(this.tag, 'audioRecorder pause finish')

      handleStateChange()

    })

    this.audioRecorder.on('resume', () = > {

      Logger.info(this.tag, 'audioRecorder resume finish')

      handleStateChange()

    })

  }



  release() {

    if (typeof (this.audioRecorder) !== `undefined`) {

      Logger.info(this.tag, 'audioRecorder  release')

      this.audioRecorder.release()

      this.audioRecorder = undefined

    }

  }



  startRecorder(pathName: string) {

    Logger.info(this.tag, `startRecorder, pathName = ${pathName}`)

    if (typeof (this.audioRecorder) !== 'undefined') {

      Logger.info(this.tag, 'start prepare')

      audioConfig.uri = pathName

      this.audioRecorder.prepare(audioConfig)

    } else {

      Logger.error(this.tag, 'case failed, audioRecorder is null')

    }

  }



  pause() {

    Logger.info(this.tag, 'audioRecorder pause called')

    if (typeof (this.audioRecorder) !== `undefined`) {

      this.audioRecorder.pause()

    }

  }



  resume() {

    Logger.info(this.tag, 'audioRecorder resume called')

    if (typeof (this.audioRecorder) !== `undefined`) {

      this.audioRecorder.resume()

    }

  }



  finish() {

    if (typeof (this.audioRecorder) !== `undefined`) {

      this.audioRecorder.stop()

    }

  }

}
  • 拍照錄像功能:通過引入相機(jī)模塊接口@ohos.multimedia.camera,例如通過this.cameraManager.createCaptureSession()創(chuàng)建相機(jī)入口的實(shí)例來控制拍照和錄像,通過this.captureSession.start()開始會話工作,[源碼參考]
/*

 * Copyright (c) 2022 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import camera from '@ohos.multimedia.camera'

import deviceInfo from '@ohos.deviceInfo'

import fileio from '@ohos.fileio'

import image from '@ohos.multimedia.image'

import media from '@ohos.multimedia.media'

import mediaLibrary from '@ohos.multimedia.mediaLibrary'

import Logger from '../model/Logger'

import MediaUtils from '../model/MediaUtils'



const CameraMode = {

  MODE_PHOTO: 0, // 拍照模式

  MODE_VIDEO: 1 // 錄像模式

}



const CameraSize = {

  WIDTH: 1920,

  HEIGHT: 1080

}



export default class CameraService {

  private tag: string = 'CameraService'

  private context: any = undefined

  private mediaUtil: MediaUtils = undefined

  private cameraManager: camera.CameraManager = undefined

  private cameras: Array< camera.CameraDevice > = undefined

  private cameraId: string = ''

  private cameraInput: camera.CameraInput = undefined

  private previewOutput: camera.PreviewOutput = undefined

  private photoOutPut: camera.PhotoOutput = undefined

  private captureSession: camera.CaptureSession = undefined

  private mReceiver: image.ImageReceiver = undefined

  private photoUri: string = ''

  private fileAsset: mediaLibrary.FileAsset = undefined

  private fd: number = -1

  private curMode = CameraMode.MODE_PHOTO

  private videoRecorder: media.VideoRecorder = undefined

  private videoOutput: camera.VideoOutput = undefined

  private handleTakePicture: (photoUri: string) = > void = undefined

  private cameraOutputCapability: camera.CameraOutputCapability = undefined

  private videoConfig: any = {

    audioSourceType: 1,

    videoSourceType: 0,

    profile: {

      audioBitrate: 48000,

      audioChannels: 2,

      audioCodec: 'audio/mp4v-es',

      audioSampleRate: 48000,

      durationTime: 1000,

      fileFormat: 'mp4',

      videoBitrate: 48000,

      videoCodec: 'video/mp4v-es',

      videoFrameWidth: 640,

      videoFrameHeight: 480,

      videoFrameRate: 30

    },

    url: '',

    orientationHint: 0,

    location: {

      latitude: 30, longitude: 130

    },

    maxSize: 10000,

    maxDuration: 10000

  }



  constructor(context: any) {

    this.context = context

    this.mediaUtil = MediaUtils.getInstance(context)

    this.mReceiver = image.createImageReceiver(CameraSize.WIDTH, CameraSize.HEIGHT, 4, 8)

    Logger.info(this.tag, 'createImageReceiver')

    this.mReceiver.on('imageArrival', () = > {

      Logger.info(this.tag, 'imageArrival')

      this.mReceiver.readNextImage((err, image) = > {

        Logger.info(this.tag, 'readNextImage')

        if (err || image === undefined) {

          Logger.error(this.tag, 'failed to get valid image')

          return

        }

        image.getComponent(4, (errMsg, img) = > {

          Logger.info(this.tag, 'getComponent')

          if (errMsg || img === undefined) {

            Logger.info(this.tag, 'failed to get valid buffer')

            return

          }

          let buffer = new ArrayBuffer(4096)

          if (img.byteBuffer) {

            buffer = img.byteBuffer

          } else {

            Logger.error(this.tag, 'img.byteBuffer is undefined')

          }

          this.savePicture(buffer, image)

        })

      })

    })

  }



  async savePicture(buffer: ArrayBuffer, img: image.Image) {

    Logger.info(this.tag, 'savePicture')

    this.fileAsset = await this.mediaUtil.createAndGetUri(mediaLibrary.MediaType.IMAGE)

    this.photoUri = this.fileAsset.uri

    Logger.info(this.tag, `this.photoUri = ${this.photoUri}`)

    this.fd = await this.mediaUtil.getFdPath(this.fileAsset)

    Logger.info(this.tag, `this.fd = ${this.fd}`)

    await fileio.write(this.fd, buffer)

    await this.fileAsset.close(this.fd)

    await img.release()

    Logger.info(this.tag, 'save image done')

    if (this.handleTakePicture) {

      this.handleTakePicture(this.photoUri)

    }

  }



  async initCamera(surfaceId: string) {

    Logger.info(this.tag, 'initCamera')

    await this.releaseCamera()

    Logger.info(this.tag, `deviceInfo.deviceType = ${deviceInfo.deviceType}`)

    if (deviceInfo.deviceType === 'default') {

      this.videoConfig.videoSourceType = 1

    } else {

      this.videoConfig.videoSourceType = 0

    }

    this.cameraManager = await camera.getCameraManager(this.context)

    Logger.info(this.tag, 'getCameraManager')

    this.cameras = await this.cameraManager.getSupportedCameras()

    Logger.info(this.tag, `get cameras ${this.cameras.length}`)

    if (this.cameras.length === 0) {

      Logger.info(this.tag, 'cannot get cameras')

      return

    }



    let cameraDevice = this.cameras[0]

    this.cameraInput = await this.cameraManager.createCameraInput(cameraDevice)

    this.cameraInput.open()

    Logger.info(this.tag, 'createCameraInput')

    this.cameraOutputCapability = await this.cameraManager.getSupportedOutputCapability(cameraDevice)

    let previewProfile = this.cameraOutputCapability.previewProfiles[0]

    this.previewOutput = await this.cameraManager.createPreviewOutput(previewProfile, surfaceId)

    Logger.info(this.tag, 'createPreviewOutput')

    let mSurfaceId = await this.mReceiver.getReceivingSurfaceId()

    let photoProfile = this.cameraOutputCapability.photoProfiles[0]

    this.photoOutPut = await this.cameraManager.createPhotoOutput(photoProfile, mSurfaceId)

    this.captureSession = await this.cameraManager.createCaptureSession()

    Logger.info(this.tag, 'createCaptureSession')

    await this.captureSession.beginConfig()

    Logger.info(this.tag, 'beginConfig')

    await this.captureSession.addInput(this.cameraInput)

    await this.captureSession.addOutput(this.previewOutput)

    await this.captureSession.addOutput(this.photoOutPut)

    await this.captureSession.commitConfig()

    await this.captureSession.start()

    Logger.info(this.tag, 'captureSession start')

  }



  setTakePictureCallback(callback) {

    this.handleTakePicture = callback

  }



  async takePicture() {

    Logger.info(this.tag, 'takePicture')

    if (this.curMode === CameraMode.MODE_VIDEO) {

      this.curMode = CameraMode.MODE_PHOTO

    }

    let photoSettings = {

      rotation: camera.ImageRotation.ROTATION_0,

      quality: camera.QualityLevel.QUALITY_LEVEL_MEDIUM,

      location: { // 位置信息,經(jīng)緯度

        latitude: 12.9698,

        longitude: 77.7500,

        altitude: 1000

      },

      mirror: false

    }

    await this.photoOutPut.capture(photoSettings)

    Logger.info(this.tag, 'takePicture done')

    AppStorage.Set('isRefresh', true)

  }



  async startVideo() {

    Logger.info(this.tag, 'startVideo begin')

    await this.captureSession.stop()

    await this.captureSession.beginConfig()

    if (this.curMode === CameraMode.MODE_PHOTO) {

      this.curMode = CameraMode.MODE_VIDEO

      if (this.photoOutPut) {

        await this.captureSession.removeOutput(this.photoOutPut)

        this.photoOutPut.release()

      }

    } else {

      if (this.videoOutput) {

        await this.captureSession.removeOutput(this.videoOutput)

      }

    }

    if (this.videoOutput) {

      await this.captureSession.removeOutput(this.videoOutput)

      await this.videoOutput.release()

    }

    this.fileAsset = await this.mediaUtil.createAndGetUri(mediaLibrary.MediaType.VIDEO)

    this.fd = await this.mediaUtil.getFdPath(this.fileAsset)

    this.videoRecorder = await media.createVideoRecorder()

    this.videoConfig.url = `fd://${this.fd}`

    await this.videoRecorder.prepare(this.videoConfig)

    let videoId = await this.videoRecorder.getInputSurface()

    let videoProfile = this.cameraOutputCapability.videoProfiles[0];

    this.videoOutput = await this.cameraManager.createVideoOutput(videoProfile, videoId)

    await this.captureSession.addOutput(this.videoOutput)

    await this.captureSession.commitConfig()

    await this.captureSession.start()

    await this.videoOutput.start()

    await this.videoRecorder.start()

    Logger.info(this.tag, 'startVideo end')

  }



  async stopVideo() {

    Logger.info(this.tag, 'stopVideo called')

    await this.videoRecorder.stop()

    await this.videoOutput.stop()

    await this.videoRecorder.release()

    await this.fileAsset.close(this.fd)

  }



  async releaseCamera() {

    Logger.info(this.tag, 'releaseCamera')

    if (this.cameraInput) {

      await this.cameraInput.close()

    }

    if (this.previewOutput) {

      await this.previewOutput.release()

    }

    if (this.photoOutPut) {

      await this.photoOutPut.release()

    }

    if (this.videoOutput) {

      await this.videoOutput.release()

    }

    if (this.captureSession) {

      await this.captureSession.release()

    }

  }

}

image.png

約束與限制

1.rk3568底層錄像功能有問題,暫不支持錄像功能,當(dāng)前拍照功能僅支持部分機(jī)型。

2.本示例僅支持標(biāo)準(zhǔn)系統(tǒng)上運(yùn)行。

3.本示例為Stage模型,已適配API version 9版本SDK,版本號:3.2.11.9;

4.本示例需要使用DevEco Studio 3.1 Beta2 (Build Version: 3.1.0.400, built on April 7, 2023)及以上版本才可編譯運(yùn)行。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8577

    瀏覽量

    151023
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2339

    瀏覽量

    42818
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙Flutter實(shí)戰(zhàn):08-如何調(diào)試代碼

    # 鴻蒙Flutter實(shí)戰(zhàn):如何調(diào)試代碼 ## 1.環(huán)境搭建 參考文章[鴻蒙Flutter實(shí)戰(zhàn):01-搭建開發(fā)環(huán)境](https://g
    發(fā)表于 10-23 16:29

    鴻蒙Flutter實(shí)戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實(shí)戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    鴻蒙Flutter實(shí)戰(zhàn):05-使用第三方插件

    # 鴻蒙Flutter 實(shí)戰(zhàn):使用第三方插件 在鴻蒙Flutter開發(fā)中,如果涉及到使用原生功能,就要使用插件。使用插件有兩種方式,一種是自己編寫原生ArkTS代碼,在Dart側(cè)調(diào)用
    發(fā)表于 10-22 21:54

    擺脫自建的繁瑣,EDA元件轉(zhuǎn)cadence原理圖封裝實(shí)戰(zhàn)技巧

    擺脫自建的繁瑣,EDA元件轉(zhuǎn)cadence原理圖封裝實(shí)戰(zhàn)技巧
    的頭像 發(fā)表于 08-24 12:29 ?2641次閱讀
    擺脫自建<b class='flag-5'>庫</b>的繁瑣,EDA元件<b class='flag-5'>庫</b>轉(zhuǎn)cadence原理圖封裝<b class='flag-5'>庫</b><b class='flag-5'>實(shí)戰(zhàn)</b>技巧

    鴻蒙開發(fā)文件管理:【@ohos.fileManager (公共文件訪問與管理)】

    該模塊提供公共文件訪問和管理的服務(wù)接口,向下對接底層文件管理服務(wù),如媒體庫、外卡管理;向上對應(yīng)用程序提供公共文件查詢、創(chuàng)建的能力。
    的頭像 發(fā)表于 06-12 17:00 ?872次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>文件管理:【@ohos.fileManager (公共文件訪問與管理)】

    鴻蒙開發(fā)接口媒體:【@ohos.multimedia.media (媒體服務(wù))】

    媒體子系統(tǒng)為開發(fā)者提供一套簡單且易于理解的接口,使得開發(fā)者能夠方便接入系統(tǒng)并使用系統(tǒng)的媒體資源。
    的頭像 發(fā)表于 06-06 11:03 ?837次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>接口<b class='flag-5'>媒體</b>:【@ohos.multimedia.media (<b class='flag-5'>媒體</b>服務(wù))】

    鴻蒙開發(fā)接口媒體:【@ohos.multimedia.medialibrary (媒體庫管理)】

    獲取媒體庫的實(shí)例,用于訪問和修改用戶等個人媒體數(shù)據(jù)信息(如音頻、視頻、圖片、文檔等)。
    的頭像 發(fā)表于 06-03 11:52 ?1141次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>接口<b class='flag-5'>媒體</b>:【@ohos.multimedia.medialibrary (<b class='flag-5'>媒體庫</b>管理)】

    網(wǎng)易推出Filmly媒體庫播放器,支持網(wǎng)盤影視資源直連

     5 月 6 日報道,據(jù) IT 之家的撰稿人介紹,網(wǎng)易近期推出了一款名為“網(wǎng)易 Filmly”的媒體庫播放器應(yīng)用。其功能與知名媒體庫軟件Infuse相仿,并具備直接連接網(wǎng)盤影視資源(目前兼容阿里云盤及百度網(wǎng)盤)的能力。
    的頭像 發(fā)表于 05-06 14:19 ?914次閱讀

    鴻蒙開發(fā)實(shí)戰(zhàn):網(wǎng)絡(luò)請求【axios】

    [Axios]?,是一個基于 promise 的網(wǎng)絡(luò)請求,可以運(yùn)行 node.js 和瀏覽器中。本基于[Axios]原v1.3.4版本進(jìn)行適配,使其可以運(yùn)行在 OpenHarmony,并沿用其現(xiàn)有用法和特性。
    的頭像 發(fā)表于 03-25 16:47 ?3869次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:網(wǎng)絡(luò)請求<b class='flag-5'>庫</b>【axios】

    鴻蒙實(shí)戰(zhàn)開發(fā)Camera組件:【相機(jī)

    相機(jī)組件支持相機(jī)業(yè)務(wù)的開發(fā),開發(fā)者可以通過已開放的接口實(shí)現(xiàn)相機(jī)硬件的訪問、操作和新功能開發(fā),最常
    的頭像 發(fā)表于 03-08 16:20 ?614次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>開發(fā)</b>Camera組件:【<b class='flag-5'>相機(jī)</b>】

    鴻蒙實(shí)戰(zhàn)項目開發(fā):【短信服務(wù)】

    、OpenHarmony 多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)鴻蒙項目實(shí)戰(zhàn)等等)鴻蒙(Harmon
    發(fā)表于 03-03 21:29

    鴻蒙這么大聲勢,為何遲遲看不見崗位?最新數(shù)據(jù)來了

    管理 多媒體技術(shù) 安全技能 任務(wù)管理 WebGL 國際化開發(fā) 應(yīng)用測試 DFX面向未來設(shè)計 鴻蒙系統(tǒng)移植和裁剪定制 …… 《鴻蒙開發(fā)
    發(fā)表于 02-29 20:53

    鴻蒙媒體開發(fā)【簡述】

    錄制)、圖片等。 如下圖所示,媒體系統(tǒng)面向應(yīng)用開發(fā)提供音視頻應(yīng)用、圖庫應(yīng)用的編程框架接口;面向設(shè)備開發(fā)提供對接不同硬件芯片適配加速功能;中間以服務(wù)形態(tài)提供媒體核心功能和管理機(jī)制。 音
    發(fā)表于 02-28 17:53

    純血鴻蒙系統(tǒng),拿什么與安卓、iOS比?

    ArkUI …… 2、鴻蒙進(jìn)階 Stage模型 網(wǎng)絡(luò)、數(shù)據(jù)管理 一次開發(fā)多段部署 …… 3、鴻蒙媒體技術(shù) 音頻 視頻 相機(jī) 圖片 …… 4
    發(fā)表于 02-21 21:04

    使用 Taro 開發(fā)鴻蒙原生應(yīng)用 —— 快速上手,鴻蒙應(yīng)用開發(fā)指南

    隨著鴻蒙系統(tǒng)的不斷完善,許多應(yīng)用廠商都希望將自己的應(yīng)用移植到鴻蒙平臺上。最近,Taro 發(fā)布了 v4.0.0-beta.x 版本,支持使用 Taro 快速開發(fā)鴻蒙原生應(yīng)用,也可將現(xiàn)有的
    的頭像 發(fā)表于 02-02 16:09 ?860次閱讀
    使用 Taro <b class='flag-5'>開發(fā)</b><b class='flag-5'>鴻蒙</b>原生應(yīng)用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應(yīng)用<b class='flag-5'>開發(fā)</b>指南
    主站蜘蛛池模板: 99在线免费视频| 久久亚洲A片COM人成A| 视频一区精品自拍亚洲| yy8090理论三级在线看| 欧美亚洲日韩在线在线影院 | 尤物yw193can入口| 精品久久久麻豆国产精品| 亚洲天堂视频网站| 国语自产偷成人精品视频| 亚洲精品久久7777777| 精品一成人岛国片在线观看| 亚洲精品午睡沙发系列 | 少妇的肉体AA片免费观看| 福利一区福利二区| 武侠古典久久亚洲精品| 韩国三级久久精品| 印度性hd18| 男人桶爽女人| 二级片免费看| 亚洲AV人无码综合在线观看蜜桃| 韩国羞羞秘密教学子开车漫书 | 午夜国产精品视频| 久久草香蕉频线观| 亚洲2017久无码| 精品爽爽久久久久久蜜臀| 亚洲精品在线观看视频| 国产精品www视频免费看| 亚洲精品一区三区三区在线观看| 久久久96人妻无码精品蜜桃| 99热热在线精品久久| 臀精插宫NP文| 久久sese| 成年人视频在线免费播放| 婷婷亚洲AV色香蕉蜜桃| 久久大综合| 高清无码中文字幕在线观看视频| 亚洲日本天堂在线| 全文都是肉高h文| 久久99精品国产99久久6男男| 爆操日本美女| 野花香HD免费高清版6高清版|