基于跨設(shè)備遷移和分布式文件能力的DistributedMail解析
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
一、DistributedMail演示效果
(一)項(xiàng)目效果展示
(二)提示在多設(shè)備調(diào)試過程中的注意
想要多設(shè)備調(diào)試務(wù)必在Tools下面選擇Super device。如果選擇單個(gè)設(shè)備并進(jìn)行分布式操作就會(huì)出現(xiàn):
選擇完多設(shè)備后,務(wù)必分別在兩個(gè)設(shè)備部署應(yīng)用。如果只部署了一臺(tái)也是不行的。
(三)解決頁(yè)面顯示的問題
需要注意的是,因?yàn)樵募季值脑颍w移到其他設(shè)備的頁(yè)面布局出現(xiàn)了問題,在遠(yuǎn)程模擬器上呈現(xiàn)的就是遷移到其他設(shè)備的頁(yè)面的確定按鈕看不見。這最開始屬實(shí)把我給整懵了。
如下:
百二秦關(guān)終屬楚!!!!找了半天終于弄明白了并解決。
手機(jī)快捷控制欄把按鈕遮蓋了
1.分析問題:
- 要么是dialog_layout_device.xml布局出現(xiàn)了問題,把下面的組件擠出去了;
- 要么是DeviceSelectDialog.class中創(chuàng)建的ListDialog的設(shè)置出現(xiàn)了問題;
- 要么是手機(jī)快捷控制欄把按鈕遮蓋了。
2.調(diào)整dialog_layout_device.xml布局,發(fā)現(xiàn)此布局為方向布局,按權(quán)重分配高度,其中ListContainer的ohos:weight=“1”,故刪去此行并把高度設(shè)為150vp(總共300vp,遷移到其他設(shè)備的Text50vp,最后的水平方向容器)(確定、占位、取消三個(gè)組件)共占100vp)其結(jié)果如下圖:

3.確定是ListDialog彈窗的問題就返回DeviceSelectDialog.class中去分析
(1)分析大致結(jié)構(gòu)(這里就不具現(xiàn)化了,后面會(huì)對(duì)整個(gè)工程進(jìn)行剖析)
(2)控制變量進(jìn)行調(diào)試,發(fā)現(xiàn)把彈窗放在屏幕中間,取消和確定按鈕可以出現(xiàn)。
最終確定是手機(jī)快捷控制欄把按鈕遮蓋了,最終解決方案,為了保證ListContainer可以很好的展示出可遷移設(shè)備且彈窗看起來更大氣一點(diǎn),dialog_layout_device.xml只把總體方向布局的高度變?yōu)閛hos:height=“400vp”,把對(duì)齊方式改為居中。setAlignment(LayoutAlignment.CENTER);
如果還是想把彈窗弄在下面,且可以顯示取消和確定按鈕,就把setAlignment(LayoutAlignment.BOTTOM);布局文中下方留出100多的vp給手機(jī)快捷控制欄就行。(具體操作把ListContainer的ohos:weight="1"刪去,對(duì)整體布局的高度進(jìn)行具象化,即不按比例按數(shù)值)
最終效果:
二、工程目錄分析
三、權(quán)限申請(qǐng)
很明顯的,在此應(yīng)用部署后,有兩個(gè)權(quán)限彈框彈出。
- 第一個(gè)是訪問圖片和媒體的權(quán)限
- 第二個(gè)是使用多設(shè)備協(xié)同的的權(quán)限
但其實(shí)本應(yīng)用申請(qǐng)了六個(gè)權(quán)限:
在MainAbility中的onStart()函數(shù)中:

<a name=“permission”></a>大家有沒有想過這樣一個(gè)問題:為什么這里permission里就三個(gè)權(quán)限,其他三個(gè)權(quán)限呢,為什么這里有三個(gè)權(quán)限,工程演示的時(shí)候卻是有兩個(gè)確定彈框呢。其原因:
敏感權(quán)限的申請(qǐng)需要按照動(dòng)態(tài)申請(qǐng)流程向用戶申請(qǐng)授權(quán)。非敏感權(quán)限不涉及用戶的敏感數(shù)據(jù)或危險(xiǎn)操作,僅需在config.json中聲明,應(yīng)用安裝后即被授權(quán)。另外三個(gè)是非敏感權(quán)限。
應(yīng)用動(dòng)態(tài)申請(qǐng)權(quán)限而應(yīng)用最開始只請(qǐng)求了兩個(gè)權(quán)限。另外一個(gè)修改本地圖片和媒體的權(quán)限并沒有開始申請(qǐng)僅此而已。
- //訪問圖片和媒體
- "ohos.permission.READ_USER_STORAGE",
- //允許不同設(shè)備間的數(shù)據(jù)交換。
- "ohos.permission.DISTRIBUTED_DATASYNC"
對(duì)于權(quán)限的申請(qǐng)有代碼示例工程(Permission),之后會(huì)對(duì)權(quán)限進(jìn)行更全面的學(xué)習(xí)并對(duì)工程進(jìn)行更全面的剖析。
獲取分布式設(shè)備即MailEditSlice中setClickAction方法
四、界面分析(重點(diǎn)layout的梳理)
1.在界面分析的時(shí)候,發(fā)現(xiàn)layout的xml文件標(biāo)紅,發(fā)現(xiàn)代碼示例工程為SDKversion2.0所以出現(xiàn)了問題。下面是一個(gè)例子其他的不列全。<a name=“version”></a>
2.且未用string.json保存字符串<a name=“string”></a>
3.對(duì)moudle_mail_edit.xml進(jìn)行布局分析其他幾個(gè)Layout組件很少就不贅述了。
五、頁(yè)面梳理(slice的梳理)
1.打開MailEditSlice,發(fā)現(xiàn)不規(guī)范的地方,關(guān)于final的添加。
2.對(duì)其分析(關(guān)于頁(yè)面跨設(shè)備遷移看我前一篇文章PageAbility全面解析有詳解)
六、郵件正文數(shù)據(jù)、郵件初始化、郵件數(shù)據(jù)處理
- bean/MailDataBean.java,用于表示郵件正文數(shù)據(jù)
- MailDataBean.java中對(duì)郵件數(shù)據(jù)進(jìn)行封裝,對(duì)Param頁(yè)面間傳遞的信息進(jìn)行處理
- MailEditSlice頁(yè)面中,我們把郵件內(nèi)容初始化即上面slice中fillview部分
- onSaveData()和onRestoreData()方法來進(jìn)行傳遞和恢復(fù)
預(yù)處理:
七、問題總結(jié)
1.(未解決)怎么使得彈窗不被手機(jī)快捷欄遮擋,就像官方文檔給的圖一樣。
2.(已解決)本應(yīng)用申請(qǐng)了六個(gè)權(quán)限,但MainAbility中requestPermission()只有三個(gè),而且項(xiàng)目演示中,最開始只有兩個(gè)權(quán)限申請(qǐng)彈窗。筆者已解決在文中權(quán)限申請(qǐng)部分。
3.(已解決)因?yàn)榘姹驹?代碼示例工程為SDKversion2.0所以出現(xiàn)了問題),
4.(已解決)且未用string.json保存字符串
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)