HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第51天,应用间使用Want分享数据。

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第51天,应用间使用Want分享数据。 1、应用间使用Want分享数据

在应用使用场景中,用户经常需要将应用内的数据(如文字、图片等)分享至其他应用以供进一步处理。以分享PDF文件为例,本文将介绍如何使用Want来实现应用间的数据分享。

数据分享需要使用两个UIAbility组件(分享方和被分享方)以及一个系统组件(应用分享框)。当分享方使用startAbility()方法发起数据分享时,系统会隐式匹配所有支持接收分享数据类型的应用,并将其展示给用户以供选择。用户选择应用后,系统将启动该应用来完成数据分享操作。

在本文中,我们将使用按钮的形式触发分享操作,但实际开发中并不限于此。本文主要介绍如何配置Want以实现数据分享的功能。

本文中涉及的两个Action为:

  • ohos.want.action.select:用于启动应用分享框。
  • ohos.want.action.sendData:用于发送单个数据记录。此Action用于将数据传递给被分享方应用。

分享方

为了实现数据分享功能,分享方需要先拉起应用分享框并将要分享的数据传递给被分享方应用。因此,在分享方的代码中需要嵌套使用两层Want。在第一层中,使用隐式Want和ohos.want.action.select的action来启动应用分享框。在第二层Want中,声明要传递给被分享方应用的数据。

具体来说,可以将要分享的数据放在自定义字段parameters中,然后将包含ohos.want.action.sendData的action和parameters字段的Want作为第二层Want传递给应用分享框。被分享方应用可以通过获取参数parameters来获取分享的数据。

import common from '@ohos.app.ability.common';

let fileType = 'application/pdf';
let fileName = 'TestFile.pdf';
let fileFd = -1; // 需要获取被分享文件的FD
let fileSize; // 需要获取被分享文件的大小

function implicitStartAbility() {
  let context = getContext(this) as common.UIAbilityContext;
  let wantInfo = {
    // This action is used to implicitly match the application selctor.
    action: 'ohos.want.action.select',
    // This is the custom parameter in the first layer of want
    // which is intended to add info to application selector.
    parameters: {
      // The MIME type of pdf
      'ability.picker.type': fileType,
      'ability.picker.fileNames': [fileName],
      'ability.picker.fileSizes': [fileSize],
      // This a nested want which will be directly send to the user selected application.
      'ability.want.params.INTENT': {
        action: 'ohos.want.action.sendData',
        type: 'application/pdf',
        parameters: {
          'keyFd': { type: 'FD', value: fileFd }
        }
      }
    }
  }
}
context.startAbility(wantInfo).then(() => {
  ...
}).catch((err) => {
  ...
})

说明

目前仅支持使用文件描述符(FD)格式分享数据。获取被分享文件的文件描述符和文件名,请参考文件管理相关接口。

在以上代码中,使用了自定义字段parameters。其中,一级参数parameters中的字段ability.picker.*用于向应用选择器传递展示信息,具体字段如下:

  • ability.picker.type:用于渲染相应的文件类型图标。
  • ability.picker.fileNames:用于展示文件名。
  • ability.picker.fileSizes:用于展示文件大小,单位为字节。
  • ability.picker.fileNames和ability.picker.fileSizes是数组,两者一一对应。

效果示意如下图所示。

被分享方

为了使分享的内容能够在被分享方识别,需要在被分享方UIAbility的module.json5配置文件中的skills标签进行相应的配置。其中,actions字段和uris内的type字段分别与分享方Want参数中ability.want.params.INTENT内的action和type字段进行匹配。

{
  "module": {
    ...
    "abilities": [
    {
      ...
      "skills": [
      {
        ...
        "actions": [
          "action.system.home",
          "ohos.want.action.sendData"
          ...
        ],
        "uris": [
        {
          "type": "application/pdf"
        },
        ]
      }
      ]
    }
    ]
  }
}

当用户选择分享的应用后,嵌套在ability.want.params.INTENT字段中的Want参数将会传递给所选应用。被分享方的UIAbility被启动后,可以在其onCreate()或者onNewWant()回调中获取传入的Want参数信息。

获取到的Want参数信息示例如下,可以使用被分享文件的文件描述符(FD)进行相应操作。

{
  "deviceId": "",
  "bundleName": "com.example.myapplication",
  "abilityName": "EntryAbility",
  "moduleName": "entry",
  "uri": "",
  "type": "application/pdf",
  "flags": 0,
  "action": "ohos.want.action.sendData",
  "parameters": {
    "component.startup.newRules": true,
    "keyFd": {
      "type": "FD",
      "value": 36
    },
    "mime-type": "application/pdf",
    "moduleName": "entry",
    "ohos.aafwk.param.callerPid": 3488,
    "ohos.aafwk.param.callerToken": 537379209,
    "ohos.aafwk.param.callerUid": 20010014
  },
  "entities": []
}

在应用使用场景中,用户经常需要将一个应用内的数据(如文字、图片等)分享至另一个应用内继续操作。下面以PDF文件分享为例,介绍应用间使用Want分享数据的方法。

前提条件

  • 数据分享涉及2个UIAbility组件(分享方和被分享方)和1个系统部件(应用选择框)。当分享方通过startAbility接口发起数据分享后,将拉起应用选择框。其将隐式匹配并展示所有支持接受分享数据类型的应用,由用户主动选取,并由系统拉起点击应用完成数据的分享。
  • 在本章节中,将继续以按钮形式来触发分享,实际开发场景中并不局限于此,此章节着重讲解分享时Want的配置。
  • 本章节涉及的action:
    • ACTION_SELECT (ohos.want.action.select):指示显示应用程序选择框的操作。用于拉起应用选择框。
    • ACTION_SEND_DATA (ohos.want.action.sendData):指示发送单个数据记录的操作。用于传递数据至分享方。

开发步骤

分享方

  • Stage模型下经常会遇到需要分享文件的场景,在这种场景下我们需要使用文件描述符(FD)来传递文件。此示例中,默认已获取分享文件的路径。
import fileIO from '@ohos.fileio';

// let path = ...
// file open where path is a variable contains the file path.
let fileFd = fileIO.openSync(path, 0o102, 0o666);
  • 在前提条件中介绍了分享的流程。分享方需先拉起应用选择框,并将数据分享给应用选择框,并由应用选择框代理传递至被分享方,完成分享。因此分享方的Want需使用2层嵌套,在第1层中使用隐式Want并配合“ohos.want.action.select”action拉起应用选择框,并在自定义字段parameters内声明一个完整的want作为第2层,其中声明传递给被分享方的数据。
import wantConstant from '@ohos.ability.wantConstant';

// let path = ...
// let fileFd = ...
// let fileSize = ...
let want = {
    // This action is used to implicitly match the application selctor.
    action: wantConstant.Action.ACTION_SELECT,
    // This is the custom parameter in the first layer of want
    // which is intended to add info to application selector.
    parameters: {
        // The MIME type of pdf
        "ability.picker.type": "application/pdf",
        "ability.picker.fileNames": [path],
        "ability.picker.fileSizes": [fileSize],
        // This a nested want which will be directly send to the user selected application.        
        "ability.want.params.INTENT": {
            "action": "ohos.want.action.sendData",
            "type": "application/pdf",
            "parameters": {
               "keyFd": {"type": "FD", "value": fileFd}
            }
        }
    }
}
  • 以上代码中使用Want自定义字段paramters,其中第一层paramters中的“ability.picker.*”字段用于传递展示信息给应用选择器,具体字段表示为:

    • “ability.picker.type”:应用选择器根据该字段渲染相应的文件类型图标。
    • “ability.picker.fileNames”:应用选择器根据该字段展示文件名。
    • “ability.picker.fileSizes”:应用选择器根据该字段展示文件大小。以字节为单位。
    • "ability.picker.fileNames"与"ability.picker.fileSizes"为数组,其有一一对应关系。

例如:当"ability.picker.type"为“application/pdf”,"ability.picker.fileNames"为“[“接口文档.pdf”]”,"ability.picker.fileSizes"为“[350 * 1024]”时,应用选择器将以下形式展示。

示例代码中“ability.want.params.INTENT”字段是一个嵌套Want,内部所含action、type等字段将由应用选择器进行隐式匹配,具体隐式匹配规则可参考隐式Want匹配原理详解。当用户选择具体应用后,“ability.want.params.INTENT”字段的嵌套Want将传递至所选应用。


更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第51天,应用间使用Want分享数据。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS中,应用间数据分享可以通过Want机制实现。Want是鸿蒙系统中用于描述操作意图的对象,可以用于启动应用、传递数据等场景。在ArkTS中,Want的使用主要通过@ohos.app.ability.Want模块来实现。

首先,发送方应用需要创建一个Want对象,并设置相关参数。例如,可以通过Wantaction属性指定操作类型,通过parameters属性传递数据。以下是一个简单的示例:

import Want from '@ohos.app.ability.Want';

let want: Want = {
    action: 'action.share',
    parameters: {
        'data': 'Hello, HarmonyOS!'
    }
};

接下来,发送方应用可以通过startAbility方法启动目标应用,并传递Want对象:

import featureAbility from '@ohos.ability.featureAbility';

featureAbility.startAbility({
    want: want
}).then(() => {
    console.log('Ability started successfully.');
}).catch((error) => {
    console.error('Failed to start ability:', error);
});

在接收方应用中,可以通过onCreateonNewWant方法获取传递过来的Want对象,并从中提取数据:

import Ability from '@ohos.app.ability.Ability';
import Want from '@ohos.app.ability.Want';

export default class MyAbility extends Ability {
    onCreate(want: Want, launchParam) {
        if (want.parameters) {
            let data = want.parameters['data'];
            console.log('Received data:', data);
        }
    }
}

通过这种方式,应用间可以实现数据的分享和传递。Want机制是鸿蒙系统中应用间通信的重要方式,适用于多种场景,如启动应用、传递参数、调用服务等。

更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第51天,应用间使用Want分享数据。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在第51天的HarmonyOS鸿蒙Next ArkTS语言教程中,您将学习如何在应用间使用Want进行数据分享。Want是鸿蒙系统中用于应用间通信的机制,通过定义Want对象,您可以指定目标应用和传递的数据。具体步骤包括:创建Want对象,设置目标应用的bundleName和abilityName,通过startAbility方法启动目标应用并传递数据。这一机制使得应用间的数据共享更加高效和安全,适用于多种场景,如文件分享、内容传递等。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!