HarmonyOS Next跨設(shè)備剪貼板技術(shù)解析

在HarmonyOS Next系統(tǒng)里,跨設(shè)備剪貼板的出現(xiàn)讓多設(shè)備間的數(shù)據(jù)共享變得輕松又高效。咱們先來說說它的原理。當用戶在設(shè)備A復制數(shù)據(jù)時,系統(tǒng)剪貼板服務(wù)會對數(shù)據(jù)進行處理,然后通過設(shè)備間的連接通道(比如Wi-Fi、藍牙,在同一局域網(wǎng)下效果更佳)將數(shù)據(jù)同步到設(shè)備B的剪貼板服務(wù)。這個過程中,設(shè)備A和設(shè)備B需要登錄同一華為賬號,并且都要打開Wi-Fi和藍牙開關(guān),這樣才能確保數(shù)據(jù)能準確無誤地傳輸。

從數(shù)據(jù)同步機制來看,它有點像快遞運輸。每個設(shè)備的剪貼板服務(wù)就像是快遞站點,數(shù)據(jù)就是包裹。當數(shù)據(jù)被復制后,它會被“打包”并通過特定的“運輸路線”(設(shè)備連接通道)送到目標設(shè)備的“站點”(剪貼板服務(wù))。而且,跨設(shè)備復制的數(shù)據(jù)在兩分鐘內(nèi)有效,就像快遞包裹有個保鮮期一樣,過了這個時間,數(shù)據(jù)就失效啦。

再講講剪貼板數(shù)據(jù)生命周期。從數(shù)據(jù)被復制進入剪貼板,到被粘貼或者過期失效,這個過程中系統(tǒng)會對數(shù)據(jù)進行管理。在有效時間內(nèi),數(shù)據(jù)隨時準備被粘貼到其他設(shè)備上,一旦過期,就會被清理掉,以保證剪貼板的空間和數(shù)據(jù)的時效性。

在實際開發(fā)中,跨設(shè)備剪貼板的API使用是重點。先看getSystemPasteboard(),這就像是打開了設(shè)備的剪貼板倉庫大門,通過它我們可以獲取到系統(tǒng)剪貼板對象,后續(xù)對剪貼板的操作都得通過這個對象來進行。

setData()方法呢,是用來把我們想要分享的數(shù)據(jù)“放進”剪貼板倉庫。比如我們有一段文本或者一張圖片要復制,就用這個方法把數(shù)據(jù)存進去。不過在使用自定義控件后臺訪問剪貼板時,別忘了申請ohos.permission.READ_PASTEBOARD權(quán)限,不然就沒辦法順利把數(shù)據(jù)存進去啦。

getData()則是從剪貼板倉庫里“取出”數(shù)據(jù)。當我們在設(shè)備B上想要粘貼數(shù)據(jù)時,就調(diào)用這個方法,它會返回我們之前復制的數(shù)據(jù),然后我們就能對這些數(shù)據(jù)進行處理,比如顯示在界面上或者進行其他操作。

下面給大家來個實際開發(fā)案例,看看在不同設(shè)備間復制文本與圖片是怎么實現(xiàn)的。先看設(shè)備A復制數(shù)據(jù)的代碼:

import pasteboard from '@ohos.pasteboard';
import { BusinessError } from '@ohos.base';

export async function setPasteDataTest(): Promise<void> {
    // 準備要復制的文本
    let text: string = '這是一段跨設(shè)備復制的文本';
    // 創(chuàng)建一個純文本類型的剪貼板數(shù)據(jù)對象
    let pasteData: pasteboard.PasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);
    // 獲取系統(tǒng)剪貼板對象
    let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
    // 將數(shù)據(jù)寫入剪貼板
    await systemPasteBoard.setData(pasteData).catch((err: BusinessError) => {
        console.error(`Failed to set pastedata. Code: ${err.code}, message: ${err.message}`);
    });
}

在這段代碼里,我們先定義了要復制的文本,然后用createData()方法創(chuàng)建了一個符合純文本格式的剪貼板數(shù)據(jù)對象,再通過getSystemPasteboard()獲取系統(tǒng)剪貼板對象,最后用setData()把數(shù)據(jù)寫入剪貼板。如果寫入過程出現(xiàn)錯誤,就會在控制臺打印錯誤信息。

接著看設(shè)備B粘貼數(shù)據(jù)的代碼:

import pasteboard from '@ohos.pasteboard';
import { BusinessError } from '@ohos.base';

export async function getPasteDataTest(): Promise<void> {
    // 獲取系統(tǒng)剪貼板對象
    let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
    // 從剪貼板獲取數(shù)據(jù)
    systemPasteBoard.getData((err: BusinessError, data: pasteboard.PasteData) => {
        if (err) {
            console.error(`Failed to get pastedata. Code: ${err.code}, message: ${err.message}`);
            return;
        }
        // 獲取剪貼板內(nèi)數(shù)據(jù)的個數(shù)
        let recordCount: number = data.getRecordCount(); 
        // 獲取剪貼板內(nèi)數(shù)據(jù)的類型
        let types: string = data.getPrimaryMimeType(); 
        // 獲取剪貼板內(nèi)數(shù)據(jù)的內(nèi)容
        let primaryText: string = data.getPrimaryText(); 
        console.log(`剪貼板數(shù)據(jù)個數(shù): ${recordCount}`);
        console.log(`數(shù)據(jù)類型: ${types}`);
        console.log(`數(shù)據(jù)內(nèi)容: ${primaryText}`);
    });
}

在設(shè)備B這邊,同樣先獲取系統(tǒng)剪貼板對象,然后用getData()方法從剪貼板獲取數(shù)據(jù)。這里通過回調(diào)函數(shù)處理獲取到的數(shù)據(jù),如果獲取過程有錯誤,也會打印錯誤信息。獲取到數(shù)據(jù)后,我們可以進一步處理,這里只是簡單地把數(shù)據(jù)的相關(guān)信息打印出來。

如果要復制圖片,原理類似,不過數(shù)據(jù)類型就不是純文本啦,而是圖片對應(yīng)的MIME類型。比如在設(shè)備A上復制圖片:

import pasteboard from '@ohos.pasteboard';
import { BusinessError } from '@ohos.base';

export async function setImagePasteDataTest(): Promise<void> {
    // 假設(shè)這里有一個圖片資源的路徑或者二進制數(shù)據(jù)
    let imageData = getImageDataSomehow(); 
    let pasteData: pasteboard.PasteData = pasteboard.createData(pasteboard.MIMETYPE_IMAGE_PNG, imageData);
    let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
    await systemPasteBoard.setData(pasteData).catch((err: BusinessError) => {
        console.error(`Failed to set pastedata. Code: ${err.code}, message: ${err.message}`);
    });
}

在設(shè)備B上粘貼圖片數(shù)據(jù)時,就需要根據(jù)圖片類型進行相應(yīng)的處理,比如顯示在界面上:

import pasteboard from '@ohos.pasteboard';
import { BusinessError } from '@ohos.base';

export async function getImagePasteDataTest(): Promise<void> {
    let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
    systemPasteBoard.getData((err: BusinessError, data: pasteboard.PasteData) => {
        if (err) {
            console.error(`Failed to get pastedata. Code: ${err.code}, message: ${err.message}`);
            return;
        }
        if (data.getPrimaryMimeType() === pasteboard.MIMETYPE_IMAGE_PNG) {
            let imageData = data.getPrimaryImage(); 
            // 這里可以用imageData在界面上顯示圖片
        }
    });
}

以上就是HarmonyOS Next跨設(shè)備剪貼板的技術(shù)解析和實際開發(fā)案例,希望對大家有所幫助。如果在開發(fā)過程中有什么問題,歡迎一起交流探討。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容