自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony 分布式相機(下)

系統(tǒng) OpenHarmony
我們正常會在MainAbility.ts的onCreate()函數(shù)加載的時候執(zhí)行申請授權(quán),在index.ets頁面中,當 XComponent 組件 onLoad() 回調(diào)后執(zhí)行初始化相機操作。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前面兩篇,已經(jīng)介紹了分布式相機應(yīng)用開發(fā)的整個流程,有興趣的可以回顧下:

這篇我們主要講講分布式相機開發(fā)過程中遇到的一些問題和思考,由于本地人目前主要是北向入手,所以只從應(yīng)用開發(fā)的角度總結(jié)目前遇到的問題,如有一些低級錯誤,還希望各位老師不吝賜教。

分布式相機問題一覽

對于開發(fā)過程中所遇到的一些坑,前面兩篇多少有簡單的提到一些,這里做一次規(guī)整,也算是一次回顧。

1、首次授權(quán)成功無法顯示相機預(yù)覽

解析: 我們正常會在MainAbility.ts的onCreate()函數(shù)加載的時候執(zhí)行申請授權(quán),在index.ets頁面中,當 XComponent 組件 onLoad() 回調(diào)后執(zhí)行初始化相機操作,代碼如下:

MainAbility.ts

const TAG: string = '[DistributedCamera]'
let permissionList: Array<string> = [
"ohos.permission.MEDIA_LOCATION",
"ohos.permission.READ_MEDIA",
"ohos.permission.WRITE_MEDIA",
"ohos.permission.CAMERA",
"ohos.permission.MICROPHONE",
"ohos.permission.DISTRIBUTED_DATASYNC"
]


export default class MainAbility extends Ability {
async onCreate(want, launchParam) {
console.info(`${TAG} onCreate`)
globalThis.cameraAbilityContext = this.context
await globalThis.cameraAbilityContext.requestPermissionsFromUser(permissionList)
}
}

index.ets

// ...
// 截取部分主要代碼

Column() {
XComponent({
id: 'componentId',
type: 'surface',
controller: this.XComponentController
}).onLoad(async () => {
console.info(`${TAG} XComponent onLoad is called`)
this.XComponentController.setXComponentSurfaceSize({
surfaceWidth: Resolution.DEFAULT_WIDTH,
surfaceHeight: Resolution.DEFAULT_HEIGHT
})
this.surfaceId = this.XComponentController.getXComponentSurfaceId()
console.info(`${TAG} surfaceId: ${this.surfaceId}`)
await this.initCamera()
}).height('100%')
.width('100%')
}
.width('100%')
.height('75%')
.margin({
bottom: 20
})

// ...

應(yīng)用啟動后,調(diào)用了requestPermissionsFromUser()請求權(quán)限后,但未手動授權(quán)時,查看相關(guān)日志:

OpenHarmony 分布式相機(下)-開源基礎(chǔ)軟件社區(qū)

日志告訴我們,page的生命周期已啟動到onShow,并且頁面布局也完成了加載,XComponent 組件回調(diào) onLoad() ,但是由于還未授權(quán),導致無法初始化相機,此時即便授權(quán)成功,也不會再進行初始化,導致相機無法啟動,無預(yù)覽視圖。

知道原因后,我們可以有多種方式解決,重點就是在授權(quán)完成后,需要再次觸發(fā)初始化相機,讓相機啟動才可以正常預(yù)覽。

我的處理方式:

1、在index.ets頁面中處理授權(quán)
2、定義是否已授權(quán)的標識,用于判斷是否可以初始化相機
3、定義是否已經(jīng)初始化相機標識,防止對此初始化
4、在page頁面初始化函數(shù)aboutToAppear()中請求權(quán)限,并在權(quán)限申請結(jié)果中添加初始化相機操作
5、XComponent 組件回調(diào) onLoad() 初始化相機操作不變

index.ets

private isInitCamera: boolean = false // 是否已初始化相機
private isPermissions: boolean = false // 是否完成授權(quán)

async aboutToAppear() {
console.info(`${TAG} aboutToAppear`)
globalThis.cameraAbilityContext.requestPermissionsFromUser(permissionList).then(async (data) => {
console.info(`${TAG} data permissions: ${JSON.stringify(data.permissions)}`)
console.info(`${TAG} data authResult: ${JSON.stringify(data.authResults)}`)
// 判斷授權(quán)是否完成
let resultCount: number = 0
for (let result of data.authResults) {
if (result === 0) {
resultCount += 1
}
}
if (resultCount === permissionList.length) {
this.isPermissions = true
}
await this.initCamera()
// 獲取縮略圖
this.mCameraService.getThumbnail(this.functionBackImpl)
})
}

2、相機應(yīng)用未關(guān)閉,系統(tǒng)息屏后重新點亮,重新返回相機應(yīng)用,無預(yù)覽輸出流返回

解析: 從現(xiàn)象看,預(yù)覽畫面卡在息屏前的狀態(tài),需要退出應(yīng)用后,重啟應(yīng)用才能正常預(yù)覽。從日志上看沒有查看到具體的原因,只是camera_host的數(shù)據(jù)量日志消失。
猜想:相機在系統(tǒng)息屏后強制關(guān)閉,需要重新加載相機才能正常預(yù)覽,實現(xiàn)方式如下:
1、在page的onPageShow()回調(diào)函數(shù)中重新初始化相機
2、在page的onPageHide()函數(shù)中釋放相機資源,減少系統(tǒng)資源不必要的消耗。

index.ets

async onPageShow() {
console.info(`${TAG} onPageShow`)
await this.initCamera()
}
onPageHide() {
console.info(`${TAG} onPageHide`)
this.isSwitchDeviceing = false
this.isInitCamera = false
this.mCameraService.releaseCamera()
}

結(jié)論: 實踐驗證此方法有效解決息屏后點亮返回相機無法預(yù)覽的問題。

3、加載遠程相機,在會話管理中添加拍照輸出流,無法拍照,預(yù)覽黑屏

解析: 兩臺設(shè)備pin碼認證通過,連接成功,在主控端選擇一臺被控端設(shè)備時,加載相機,流程與加載本地相機相同,流程如下:

createCameraInput()
createPreviewOutput()
createPhotoOutput()
createSession()

* createSession.beginConfig()
* createSession.addInput(CameraInput)
* createSession.addOutput(PreviewOutput)
* createSession.addOutput(PhotoOutput)
* createSession.commitConfig()
* createSession.start()

經(jīng)過排查,發(fā)現(xiàn)日志中返回異常not found in supported streams,詳情可以查看關(guān)聯(lián) ??issues??

原因: 在創(chuàng)建PhotoOutput時需要傳遞支持的拍照配置信息Profile,這里的Profile可以通過??CmeraManager.getSupportedOutputCapability()??返回的相機輸出能力CameraOutputCapability對象獲取,但遠程相機設(shè)備拍照輸出能力列表返回空,但通過查看本地相機拍照輸出能力可知DAYU200設(shè)備支持的Profile信息:

photoProfile {"format":2000,"size":{"width":1280,"height":960}}

通過此將photoProfile作為遠程相機設(shè)備構(gòu)建拍照輸出流的入?yún)鼍芭恼蛰敵隽?,并把此添加到拍照會話管理中,但是界面出現(xiàn)不支持此相機配置,最終關(guān)閉了相機,導致黑屏。

解決方案: 根據(jù)此問題,目前只能根據(jù)場景判斷是否需要添加拍照輸出流到會話管理,對于本地相機則可以添加拍照輸出流,執(zhí)行拍照業(yè)務(wù),遠程相機則不添加拍照輸出流,這也就不能執(zhí)行拍照業(yè)務(wù),希望社區(qū)有解決方案。

4、切換不同設(shè)備上的相機,相機預(yù)覽輸出流出現(xiàn)異常,無法顯示遠程相機的畫面

解析: 此問題存在的原因可能有多種,這里我說下我遇到的情況,
1、分布式連接被斷開,但是因為底層機制,設(shè)備之間下線需要在一段時間內(nèi)才能上報(預(yù)計5分鐘),所以在應(yīng)用層看到可以連接的遠端設(shè)備,其實已經(jīng)下線了,這時當然不能切換到遠程相機。

2、與問題3中描述的相同,因為添加了一個無法支持的拍照配置信息導致相機被關(guān)閉。

解決方案

1、等待線下通知,再重新連接設(shè)備,或者等待設(shè)備自動完成重連,簡單粗暴就是重啟設(shè)備。

2、待社區(qū)反饋

5、相機業(yè)務(wù)在主線程執(zhí)行,需要將業(yè)務(wù)移動到子線程,防止UI線程堵塞

解析: 如題描述,目前可能存在堵塞UI線程的可能,需要將一些耗時的操作移動到子線程,比如預(yù)覽、拍照保存圖片等。

目前正在修改優(yōu)化,關(guān)于ets的異步線程worker可以查看之前寫的一篇關(guān)于:??OpenHarmony stage worker 多線程??。

6、遠程相機預(yù)覽數(shù)據(jù)傳輸存在500ms的延遲

解析: 在wifi環(huán)境下,被控端相機將預(yù)覽數(shù)據(jù)通過軟總線傳輸?shù)街骺囟孙@示,有500ms左右的延遲,此問題待排查,具體是那個環(huán)境出現(xiàn)的延遲。

7、no permission for function call

解析: 用戶動態(tài)授予:允許不同設(shè)備間的數(shù)據(jù)(ohos.permission.DISTRIBUTED_DATASYNC) 交換權(quán)限后,DeviceManager.startDeviceDiscovery()啟動發(fā)現(xiàn)周邊設(shè)備總會出現(xiàn)異常,日志中提示:

discoverFail data= {"subscribeId":26386,"reason":-20007,"errInfo":"no permission for function call."}

原因: 非系統(tǒng)應(yīng)用無法使用DeviceManager,詳細可查看:??issues??

解決方案:
系統(tǒng)應(yīng)用和普通應(yīng)用是通過簽名來區(qū)分,那只要通過修改簽名UnsgnedReleasedProfileTemplate.json文件中的app-feature值為ohos_system_app,即為系統(tǒng)應(yīng)用。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-02-20 15:38:38

2023-02-20 15:29:14

分布式相機鴻蒙

2022-04-08 11:08:17

分布式數(shù)據(jù)接口同步機制

2022-06-20 15:32:55

Stage模型分布式開發(fā)

2022-04-24 16:00:03

Ability鴻蒙

2021-11-10 16:10:18

鴻蒙HarmonyOS應(yīng)用

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2023-12-26 08:59:52

分布式場景事務(wù)機制

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-09-01 05:35:58

分布式計算存儲

2019-06-19 15:40:06

分布式鎖RedisJava

2017-10-27 08:40:44

分布式存儲剪枝系統(tǒng)

2022-02-17 18:08:04

OpenHarmon應(yīng)用開發(fā)鴻蒙

2021-12-14 10:16:00

鴻蒙HarmonyOS應(yīng)用

2022-06-15 16:16:21

分布式數(shù)據(jù)庫鴻蒙

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2013-12-20 09:43:13

分布式

2024-03-01 09:53:34

2018-07-17 08:14:22

分布式分布式鎖方位

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)
點贊
收藏

51CTO技術(shù)棧公眾號