HarmonyOS Next自定義資料型別的跨應用協作:實現企業級文件管理

SameX發表於2024-10-24

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。

概述

企業級文件管理系統需要支援跨應用、跨裝置的資料共享與協同工作。透過華為HarmonyOS的統一資料管理框架(UDMF)和方舟資料管理(ArkData),我們可以輕鬆建立自定義的標準化資料型別,實現文件、圖片、音訊等資料在不同應用和裝置之間的流暢互動。本文將以企業文件管理為例,展示如何建立自定義資料型別,並在多個應用中實現跨裝置文件共享和協同編輯。

實戰場景

我們將開發一個企業文件管理系統,支援以下功能:

  • 文件、圖片和音訊檔案的自定義標準化資料型別建立。
  • 使用UDMF實現跨應用拖拽與資料共享。
  • 利用分散式物件實現多裝置的文件資料同步與協同編輯。

1. 建立自定義的資料型別

HarmonyOS支援開發者建立自定義標準化資料型別,以便處理企業文件、圖片和音訊等型別資料。首先,我們需要在應用的 utd.json5 檔案中定義這些自定義型別。

步驟一:定義文件、圖片、音訊的自定義資料型別

{
  "UniformDataTypeDeclarations": [
    {
      "TypeId": "com.company.document",
      "BelongingToTypes": ["general.file"],
      "FilenameExtensions": [".docx", ".pdf"],
      "MIMETypes": ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/pdf"],
      "Description": "Enterprise Document",
      "ReferenceURL": ""
    },
    {
      "TypeId": "com.company.image",
      "BelongingToTypes": ["general.image"],
      "FilenameExtensions": [".jpg", ".png"],
      "MIMETypes": ["image/jpeg", "image/png"],
      "Description": "Enterprise Image",
      "ReferenceURL": ""
    },
    {
      "TypeId": "com.company.audio",
      "BelongingToTypes": ["general.audio"],
      "FilenameExtensions": [".mp3", ".wav"],
      "MIMETypes": ["audio/mpeg", "audio/wav"],
      "Description": "Enterprise Audio File",
      "ReferenceURL": ""
    }
  ]
}

在這個檔案中,我們建立了三個自定義資料型別:文件、圖片和音訊檔案,分別對應 .docx.pdf.jpg.mp3 等檔案格式。

步驟二:使用自定義資料型別

在應用中,我們將透過ArkData統一資料結構,將自定義資料型別封裝到資料物件中,以便在應用間拖拽和共享。

import { uniformDataStruct, uniformTypeDescriptor, unifiedDataChannel } from '@kit.ArkData';

let documentDetails: Record<string, string> = {
  'author': 'John Doe',
  'created_at': '2024-10-01',
};

let document: uniformDataStruct.File = {
  uniformDataType: 'com.company.document',
  filename: 'enterprise_document.docx',
  filePath: '/documents/enterprise_document.docx',
  details: documentDetails,
};

// 建立圖片資料
let imageDetails: Record<string, string> = {
  'resolution': '1920x1080',
};

let image: uniformDataStruct.Image = {
  uniformDataType: 'com.company.image',
  url: '/images/enterprise_image.jpg',
  description: 'Enterprise Image',
  details: imageDetails,
};

// 建立音訊資料
let audioDetails: Record<string, string> = {
  'duration': '120s',
};

let audio: uniformDataStruct.Audio = {
  uniformDataType: 'com.company.audio',
  url: '/audio/enterprise_audio.mp3',
  description: 'Enterprise Audio File',
  details: audioDetails,
};

透過上述程式碼,我們將自定義的文件、圖片和音訊檔案封裝為標準化資料結構物件。

2. 使用UDMF統一資料結構處理跨應用文件拖拽和共享

接下來,我們實現跨應用文件拖拽與共享功能。UDMF提供了統一的資料結構介面,可以在不同應用之間拖拽資料並共享。

步驟三:實現跨應用拖拽功能

在應用A中,使用者可以拖拽企業文件至目標區域:

let unifiedData = new unifiedDataChannel.UnifiedData();
let documentRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.FILE, document);
let imageRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.IMAGE, image);
let audioRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.AUDIO, audio);

unifiedData.addRecord(documentRecord);
unifiedData.addRecord(imageRecord);
unifiedData.addRecord(audioRecord);

// 啟動拖拽操作,將資料拖拽到目標應用
unifiedDataChannel.setDragData(unifiedData);

在目標應用B中,我們接收拖拽資料並解析文件、圖片和音訊檔案:

unifiedDataChannel.getDropData().then((data) => {
  let records = data.getRecords();
  records.forEach((record) => {
    let recordType = record.getValue()['uniformDataType'];
    
    switch (recordType) {
      case 'com.company.document':
        console.log('Document received: ', record.getValue()['filename']);
        break;
      case 'com.company.image':
        console.log('Image received: ', record.getValue()['url']);
        break;
      case 'com.company.audio':
        console.log('Audio received: ', record.getValue()['url']);
        break;
      default:
        console.log('Unknown data type received.');
    }
  });
});

此程式碼實現了應用間的資料拖拽與接收,能夠處理企業文件、圖片和音訊檔案。

3. 實現自定義資料型別的分散式物件管理與跨裝置協同工作

為了支援跨裝置的資料同步與協作,我們使用分散式資料物件管理自定義資料型別。透過分散式資料物件,使用者在裝置A上修改的文件將自動同步到裝置B上,確保多終端的一致性。

步驟四:建立並同步分散式資料物件

在裝置A上,我們將自定義文件作為分散式物件進行同步:

import { distributedDataObject } from '@kit.ArkData';

// 建立分散式資料物件
let sessionId = distributedDataObject.genSessionId();
let distributedDocument = distributedDataObject.create(this.context, document);

// 設定同步的sessionId
distributedDocument.setSessionId(sessionId);

// 監聽狀態變化
distributedDocument.on('status', (sessionId: string, networkId: string, status: string) => {
  if (status == 'restored') {
    console.log('Document restored on device: ', networkId);
  }
});

// 儲存文件到裝置B
let targetDeviceId = 'device_B_network_id'; // 目標裝置的網路ID
distributedDocument.save(targetDeviceId);

步驟五:在裝置B上接收文件並協同編輯

裝置B上可以透過監聽同步狀態,及時獲取裝置A上的文件修改:

let receivedDocument = distributedDataObject.create(this.context, null);

// 設定相同的sessionId以同步資料
receivedDocument.setSessionId(sessionId);

// 監聽文件同步
receivedDocument.on('change', (sessionId: string, fields: Array<string>) => {
  fields.forEach((field) => {
    console.log(`Document field ${field} changed on session ${sessionId}`);
  });
});

此程式碼確保了跨裝置的文件同步和協作,使用者可以在多個裝置上實時編輯文件,所有修改都會在各裝置之間同步。

總結

透過本文,我們展示瞭如何透過HarmonyOS的方舟資料管理與統一資料管理框架,建立自定義資料型別並在跨應用和跨裝置場景中實現資料共享和協作。關鍵步驟包括:

  1. 建立自定義的標準化資料型別,以便處理文件、圖片和音訊檔案。
  2. 使用UDMF實現跨應用資料拖拽和共享,確保不同應用之間的無縫互動。
  3. 利用分散式資料物件,實現多裝置間的資料同步和協同工作。

透過這些技術,我們能夠輕鬆構建企業級文件管理系統,實現多終端之間的協同編輯與資料共享,提升使用者體驗。

PS:感謝觀看,祝大家1024程式設計師快樂吖~

相關文章