OpenHarmony 分布式相機(下)
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
前面兩篇,已經(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
index.ets
應(yīng)用啟動后,調(diào)用了requestPermissionsFromUser()請求權(quán)限后,但未手動授權(quán)時,查看相關(guān)日志:
日志告訴我們,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
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
結(jié)論: 實踐驗證此方法有效解決息屏后點亮返回相機無法預(yù)覽的問題。
3、加載遠程相機,在會話管理中添加拍照輸出流,無法拍照,預(yù)覽黑屏
解析: 兩臺設(shè)備pin碼認證通過,連接成功,在主控端選擇一臺被控端設(shè)備時,加載相機,流程與加載本地相機相同,流程如下:
經(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作為遠程相機設(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)異常,日志中提示:
原因: 非系統(tǒng)應(yīng)用無法使用DeviceManager,詳細可查看:??issues??
解決方案:
系統(tǒng)應(yīng)用和普通應(yīng)用是通過簽名來區(qū)分,那只要通過修改簽名UnsgnedReleasedProfileTemplate.json文件中的app-feature值為ohos_system_app,即為系統(tǒng)應(yīng)用。