1# 启动远程PageAbility(仅对系统应用开放)
2
3
4启动远程PageAbility同样通过featureAbility中的startAbility接口实现。
5
6
7除引入'\@ohos.ability.featureAbility'外,还需引入'\@ohos.distributedHardware.deviceManager',通过DeviceManager(该组件提供帐号无关的分布式设备的认证组网能力)的[getTrustedDeviceListSync](../reference/apis-distributedservice-kit/js-apis-device-manager-sys.md#gettrusteddevicelistsync)接口(获取信任设备列表)获取远端的deviceId,写入want中,用于启动远程PageAbility。
8
9
10由于当前DeviceManager的[getTrustedDeviceListSync](../reference/apis-distributedservice-kit/js-apis-device-manager-sys.md#gettrusteddevicelistsync)接口仅对系统应用开放,故现阶段非系统应用无法获取其他设备信息,无远程启动设备选择入口,远程启动Ability开发。
11
12
13  **表1** featureAbility接口说明
14
15| 接口名 | 接口描述 |
16| -------- | -------- |
17| startAbility(parameter: StartAbilityParameter) | 启动Ability。 |
18| startAbilityForResult(parameter: StartAbilityParameter) | 启动Ability,并在该Ability被销毁时返回执行结果。 |
19
20
21  **表2** deviceManager接口说明
22
23| 接口名 | 接口描述 |
24| -------- | -------- |
25| getTrustedDeviceListSync(): Array<DeviceInfo> | 同步获取所有可信设备列表。 |
26
27
28在跨设备场景下,启动远程PageAbility首先需要向用户申请数据同步的权限,相关接口说明如下:
29
30
31  **表3** AtManager接口说明
32
33| 接口名 | 接口描述 |
34| -------- | -------- |
35| checkAccessToken(tokenID:&nbsp;number,&nbsp;permissionName:&nbsp;string)<br>:&nbsp;Promise&lt;GrantStatus&gt; | 校验应用是否授予权限。使用Promise异步回调。返回值GrantStatus。建议使用checkAccessToken代替verifyAccessToken(已废弃),verifyAccessToken从API&nbsp;version&nbsp;9开始不再维护。 |
36
37
38  **表4** context接口说明
39
40| 接口名 | 接口描述 |
41| -------- | -------- |
42| requestPermissionsFromUser(permissions:&nbsp;Array&lt;string&gt;,&nbsp;<br>requestCode:&nbsp;number,&nbsp;resultCallback:&nbsp;AsyncCallback&lt;<br>PermissionRequestResult&gt;):&nbsp;void | 以callback形式从系统请求某些权限,详见对应[接口文档](../reference/apis-ability-kit/js-apis-inner-app-context.md#contextrequestpermissionsfromuser7-1)。 |
43
44
45如下示例代码展示了向用户申请数据同步权限的方法:
46
47```ts
48import abilityAccessCtrl from "@ohos.abilityAccessCtrl";
49import featureAbility from '@ohos.ability.featureAbility';
50import bundle from '@ohos.bundle.bundleManager';
51import hilog from '@ohos.hilog';
52
53const TAG: string = 'PagePageAbilitySecond'
54const domain: number = 0xFF00;
55
56@Entry
57@Component
58struct PagePageAbilitySecond {
59  async requestPermission(): Promise<void> {
60    hilog.info(domain, TAG, 'RequestPermission begin');
61    let array: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
62    let bundleFlag = 0;
63    let tokenID: number | undefined = undefined;
64    let userID = 100;
65    let appInfo = await bundle.getApplicationInfo('com.samples.famodelabilitydevelop', bundleFlag, userID);
66    tokenID = appInfo.accessTokenId;
67    let atManager = abilityAccessCtrl.createAtManager();
68    let requestPermissions: Array<string> = [];
69    for (let i = 0;i < array.length; i++) {
70      let result = await atManager.verifyAccessToken(tokenID, array[i]);
71      hilog.info(domain, TAG, 'checkAccessToken result:' + JSON.stringify(result));
72      if (result != abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
73        requestPermissions.push(array[i]);
74      }
75    }
76    hilog.info(domain, TAG, 'requestPermissions:' + JSON.stringify(requestPermissions));
77    if (requestPermissions.length == 0) {
78      return;
79    }
80    let context = featureAbility.getContext();
81    context.requestPermissionsFromUser(requestPermissions, 1, (error, data) => {
82      hilog.info(domain, TAG, 'error:' + error.message + ',data:' + JSON.stringify(data));
83      hilog.info(domain, TAG, 'data requestCode:' + data.requestCode);
84      hilog.info(domain, TAG, 'data permissions:' + data.permissions);
85      hilog.info(domain, TAG, 'data authResults:' + data.authResults);
86    });
87    hilog.info(domain, TAG, 'RequestPermission end');
88  }
89
90  build() {
91    //...
92  }
93}
94
95```
96
97
98在获取数据同步权限后,需要获取可信设备列表,进行设备选择。
99
100
101  如下示例展示了通过getAvailableDeviceListSync获取可信设备列表,选择设备的方法。
102
103```ts
104import deviceManager from '@ohos.distributedDeviceManager';
105import promptAction from '@ohos.promptAction';
106import hilog from '@ohos.hilog';
107
108const TAG: string = 'PagePageAbilitySecond'
109const domain: number = 0xFF00;
110
111@Entry
112@Component
113struct PagePageAbilitySecond {
114  @State deviceID: string = '';
115
116  getRemoteDeviceId(): void {
117    let dmClass: deviceManager.DeviceManager;
118    dmClass = deviceManager.createDeviceManager('com.samples.famodelabilitydevelop');
119    try {
120      if (typeof dmClass === 'object' && dmClass !== null) {
121        let list = dmClass.getAvailableDeviceListSync();
122        if (typeof (list) == undefined || list.length == 0) {
123          hilog.info(domain, TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: list is null');
124          return;
125        }
126        hilog.info(domain, TAG, `EntryAbility onButtonClick getRemoteDeviceId success[${list.length}]:` + JSON.stringify(list[0]));
127        if (list[0].networkId != undefined) {
128          this.deviceID = list[0].networkId;
129        }
130        promptAction.showToast({
131          message: this.deviceID
132        });
133      } else {
134        hilog.info(domain, TAG, 'EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null');
135      }
136    } catch (error) {
137      hilog.info(domain, TAG, `getRemoteDeviceId error, error=${error}, message=${error.message}`);
138    }
139  }
140
141  build() {
142    //...
143  }
144}
145```
146
147
148设备选择完成后,通过调用startAbility接口,显式启动远程PageAbility。
149
150
151如下示例展示了通过startAbility显式启动远程PageAbility的方法。
152
153```ts
154import featureAbility from '@ohos.ability.featureAbility';
155import Want from '@ohos.app.ability.Want';
156import promptAction from '@ohos.promptAction';
157import { BusinessError } from '@ohos.base';
158import hilog from '@ohos.hilog';
159
160const TAG: string = 'PagePageAbilitySecond'
161const domain: number = 0xFF00;
162
163@Entry
164@Component
165struct PagePageAbilitySecond {
166  @State deviceID: string = '';
167
168  onStartRemoteAbility(): void {
169    hilog.info(domain, TAG, 'onStartRemoteAbility begin');
170    let wantValue: Want = {
171      bundleName: 'ohos.samples.distributedmusicplayer',
172      abilityName: 'ohos.samples.distributedmusicplayer.MainAbility',
173      deviceId: this.deviceID, // this.deviceID的获取方式在前面的示例代码中
174    };
175    hilog.info(domain, TAG, 'onStartRemoteAbility want=' + JSON.stringify(wantValue));
176    featureAbility.startAbility({
177      want: wantValue
178    }).then((data) => {
179      promptAction.showToast({
180        message: 'start_remote_success_toast'
181      });
182      hilog.info(domain, TAG, 'onStartRemoteAbility finished, ' + JSON.stringify(data));
183    }).catch((error: BusinessError) => {
184      promptAction.showToast({
185        message: JSON.stringify(error)
186      });
187      hilog.error(domain, TAG, 'onStartRemoteAbility failed: ' + JSON.stringify(error));
188    });
189    hilog.info(domain, TAG, 'onStartRemoteAbility end');
190  }
191  build() {
192    //...
193  }
194}
195
196```
197