場景介紹
同一設備的應用程序 A、B 之間可以借助系統剪貼板服務完成簡單數據的傳遞,即應用程序 A 向剪貼板服務寫入數據后,應用程序 B 可以從中讀取出數據。在滿足分布式剪貼板服務的使用條件時,應用程序 A、B 也可以來自組網內的不同設備。
圖1 剪貼板服務示意圖
在使用剪貼板服務時,需要注意以下幾點:
- 只有在前臺獲取到焦點的應用才有讀取系統剪貼板的權限(系統默認輸入法應用除外)。
- 寫入到剪貼板服務中的剪貼板數據不會隨應用程序結束而銷毀。
- 對同一用戶而言,寫入剪貼板服務的數據會被下一次寫入的剪貼板數據所覆蓋。
- 如果設備滿足分布式組網條件,且進行復制操作的設備打開了剪貼板分布式開關,未配置“僅在本地”標志位的剪貼板數據里的 MIME 類型為純文本和 HTML 的內容可以被組網內其他打開了剪貼板分布式開關的設備粘貼出來。
- 在同一設備內,剪貼板單次傳遞內容不應超過 800KB。在分布式場景下多設備間傳遞時,每次傳遞內容不應超過 64KB。
接口說明
SystemPasteboard 提供系統剪貼板操作的相關接口,比如復制、粘貼、配置回調等。PasteData 是剪貼板服務操作的數據對象,一個 PasteData 由若干個內容節點(PasteData.Record)和一個屬性集合對象(PasteData.DataProperty)組成。Record 是存放剪貼板數據內容信息的最小單位,每個 Record 都有其特定的 MIME 類型,如純文本、HTML、URI、Intent。剪貼板數據的屬性信息存在放 DataProperty 中,包括標簽、時間戳、“僅在本地”標記位等。
- SystemPasteboard
SystemPasteboard 提供系統剪貼板服務的操作接口,比如復制、粘貼、配置回調等。
接口名 | 描述 |
---|---|
getSystemPasteboard(Context context) | 獲取系統剪切板服務的對象實例。 |
getPasteData() | 讀取當前系統剪貼板中的數據。 |
hasPasteData() | 判斷當前系統剪貼板中是否有內容。 |
setPasteData(PasteData data) | 將剪貼板數據寫入到系統剪貼板。 |
clear() | 判斷當前系統剪貼板中是否有內容。清空系統剪貼板數據。 |
addPasteDataChangedListener(IPasteDataChangedListener listener) | 用戶程序添加系統剪貼板數據變化的回調,當系統剪貼板數據發生變化時,會觸發用戶程序的回調實現。 |
removePasteDataChangedListener(IPasteDataChangedListener listener) | 用戶程序移除系統剪貼板數據變化的回調。 |
- PasteData
PasteData 是剪貼板服務操作的數據對象,其中內容節點定義為 PasteData.Record,屬性集合定義為 PasteData.DataProperty。
接口名 | 描述 |
---|---|
PasteData() | 構造器,創建一個空內容數據對象。 |
createPlainTextData(CharSequence text) | 構建一個包含純文本內容節點的數據對象。 |
creatHtmlData(String htmlText) | 構建一個包含 HTML 內容節點的數據對象。 |
creatUriData(Uri uri) | 構建一個包含 URI 內容節點的數據對象。 |
creatIntentData(Intent intent) | 構建一個包含 Intent 內容節點的數據對象。 |
getPrimaryMimeType() | 獲取數據對象中首個內容節點的 MIME 類型,如果沒有查詢到內容,將返回一個空字符串。 |
getPrimaryText() | 獲取數據對象中首個內容節點的純文本內容,如果沒有查詢到內容,將返回一個空對象。 |
addTextRecord(CharSequence text) | 向數據對象中添加一個純文本內容節點,該方法會自動更新數據屬性中的MIME類型集合,最多只能添加 128 個內容節點。 |
addRecord(Record record) | 向數據對象中添加一個內容節點,該方法會自動更新數據屬性中的 MIME 類型集合,最多只能添加 128 個內容節點。 |
getRecordCount() | 獲取數據對象中內容節點的數量。 |
getRecordAt(int index) | 獲取數據對象在指定下標處的內容節點,如果操作失敗會返回空對象。 |
removeRecordAt(int index) | 移除數據對象在指定下標處的內容節點,如果操作成功會返回 true,操作失敗會返回 false。 |
getMimeTypes() | 獲取數據對象中上所有內容節點的MIME類型列表,當內容節點為空時,返回列表為空對象。 |
getProperty() | 獲取該數據對象的屬性集合成員。 |
常量名 | 描述 |
– | – |
MIMETYPE_TEXT_PLAIN= “text/plain” | 純文本的 MIME 類型定義。 |
MIMETYPE_TEXT_HTML= “text/html” | HTML的 MIM E類型定義。 |
MIMETYPE_TEXT_URI= “text/uri” | URI的 MIME 類型定義。 |
MIMETYPE_TEXT_INTENT= “text/ohos.intent” | Intent的 MIME 類型定義。 |
MAX_RECORD_NUM=128 | 單個 PasteData 中所能包含的 Record 的數量上限。 |
- PasteData.Record
一個 PasteData 中包含若干個特定MIME類型的 PasteData.Record,每個 Record 是存放剪貼板數據內容信息的最小單位。
接口名 | 描述 |
---|---|
createPlainTextRecord(CharSequence text) | 構造一個 MIME 類型為純文本的內容節點。 |
createHtmlTextRecord(String htmlText) | 構造一個 MIME 類型為HTML的內容節點。 |
createUriRecord(Uri uri) | 構造一個 MIME 類型為URI的內容節點。 |
createIntentRecord(Intent intent) | 構造一個 MIME 類型為Intent的內容節點。 |
getPlainText() | 獲取該內容節點中的文本內容,如果沒有內容將返回空對象。 |
getHtmlText() | 獲取該內容節點中的 HTML 內容,如果沒有內容將返回空對象。 |
getUri() | 獲取該內容節點中的 URI 內容,如果沒有內容將返回空對象。 |
getIntent() | 獲取該內容節點中的 Intent 內容,如果沒有內容將返回空對象。 |
getMimeType() | 獲取該內容節點的 MIME 類型。 |
convertToText(Context context) | 將該內容節點的內容轉為文本形式。 |
- PasteData.DataProperty
每個 PasteData 中都有一個 PasteData.DataProperty 成員,其中存放著該數據對象的屬性集合,例如自定義標簽、MIME 類型集合列表,“僅在本地”標記位等。
接口名 | 描述 |
---|---|
getMimeTypes() | 獲取所屬數據對象的 MIME 類型集合列表,當內容節點為空時,返回列表為空對象。 |
hasMimeType(String mimeType) | 判斷所屬數據對象中是否包含特定 MIME類型的內容。 |
getTimestamp() | 獲取所屬數據對象被寫入系統剪貼板時的時間戳,如果該數據對象尚未被寫入,則返回0。 |
setTag(CharSequence tag) | 設置自定義標簽。 |
getTag() | 獲取自定義標簽。 |
setAdditions(PacMap extraProps) | 設置一些附加鍵值對信息 |
getAdditions() | 獲取附加鍵值對信息。 |
setLocalOnly(boolean isLocalonly) | 配置“僅在本地”標志位,默認配置為false,表示此數據對象能在分布式剪貼板場景下跨設備傳遞,否則只在本地設備使用。 |
isLocalOnly() | 查詢“僅在本地”標志位。 |
- IPasteDataChangedListener
IPasteDataChangedListener 是定義剪貼板數據變化回調的接口類,開發者需要實現此接口來編碼觸發回調時的處理邏輯。
接口名 | 描述 |
---|---|
onChanged() | 當系統剪貼板數據發生變化時的回調接口。 |
開發步驟
- 應用A獲取系統剪貼板服務。
SystemPasteboard pasteboard = SystemPasteboard.getSystemPasteboard(appContext);
- 應用A向系統剪貼板中寫入一條純文本數據。
if (pasteboard != null) {
pasteboard.setPasteData(PasteData.creatPlainTextData("Hello, world!"));
}
- 應用 B 從系統剪貼板讀取數據,將數據對象中的首個文本類型(純文本/HTML)內容信息在控件中顯示,忽略其他類型內容。
PasteData pasteData = pasteboard.getPasteData();
if (pasteData == null) {
return;
}
DataProperty dataProperty = pasteData.getProperty();
boolean hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);
boolean hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);
if (hasHtml || hasText) {
for (int i = 0; i < pasteData.getRecordCount(); i++) {
Record record = pasteData.getRecordAt(i);
String mimeType = record.getMimeType();
if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) {
text.setText(record.getHtmlText());
break;
} else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
text.setText(record.getPlainText().toString());
break;
}
}
}
- 應用 C 注冊添加系統剪貼板數據變化回調,當系統剪貼板數據發生變化時觸發處理邏輯。
IPasteDataChangedListener listener = new IPasteDataChangedListener() {
@Override
public void onChanged() {
PasteData pasteData = pasteboard.getPasteData();
if (pasteData == null) {
return;
}
// Operations to handle data change on the system pasteboard
}
};
pasteboard.addPasteDataChangedListener(listener);·
-
鴻蒙
+關注
關注
57文章
2310瀏覽量
42743 -
HarmonyOS
+關注
關注
79文章
1967瀏覽量
30018
發布評論請先 登錄
相關推薦
評論