设备环境

img

1. 问题描述

使用环境与设备: 两台 OpenHarmony L2 富设备(润和 DAYU200 / RK3568 开发板)做富对富文件互传;双端打开蓝牙、Wi-Fi 与「统一互联分享」开关。接收端运行 Share 应用 com.ohos.oneconnect.share(入口 Ability 为 ServiceExtAbility)。传输成功后,SinkModel.jumpToViewer 应通过 startAbility 拉起系统图库(Photos)或文件管理器预览。

问题现象(偶现): Sink 成功收到视频/图片后,未自动打开图库或文件管理器。
一句话概括:文件已接收成功,只是接收完成后没有自动打开查看页面。

2. 分析过程

正常预期:SendState.SUCCESS → SinkModel 延迟约 2 秒后调用 jumpToViewer → startAbility 打开图库/文件管理器。
未跳转时优先确认:

  1. 应用有没有进入 jumpToViewer
  2. 若进入了,失败原因是什么

相关日志:

08-05 20:07:43.251  1174  1174 I A00220/OneConnectShareApp: SinkModel: jumpToViewer in, will goto Photos
08-05 20:07:43.252  1174  1174 I A00220/OneConnectShareApp: NotificationManager: cancelNotification in
08-05 20:07:43.278  1174  1174 I A00220/OneConnectShareApp: NotificationManager: cancel success
08-05 20:07:43.304  1174  1174 I A00220/OneConnectShareApp: WindowManager: hide window[oneconnectshare.SinkDialog] success.
08-05 20:07:43.349  1174  1174 I A00220/OneConnectShareApp: SinkModel: jumpToViewer failed Error: The application does not have permission to call the interface., {"code":201}

结论:

  1. 已进入跳转(jumpToViewer in, will goto Photos)
  2. startAbility 失败,错误为 无权限调用该接口(code: 201)

跳转逻辑本身没有问题:按分享类型选择图库或文件管理器的 bundleName / abilityName,再对 ServiceExtensionContext 调用 startAbility。Share 以 ServiceExtAbility 为主入口,接收完成后半模态窗口已收起,进程常处于后台;系统要求从后台拉起其他应用的 UIAbility 必须持有:

ohos.permission.START_ABILITIES_FROM_BACKGROUND

可用命令核对权限声明与授权状态:

bm dump -n com.ohos.oneconnect.share

权限正常时关键字段大致如下:

"reqPermissionStates": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
],
"reqPermissions": [
    "ohos.permission.ACCESS_SERVICE_DM",
    "ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS",
    "ohos.permission.DISTRIBUTED_DATASYNC",
    "ohos.permission.FILE_ACCESS_MANAGER",
    "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED",
    "ohos.permission.MANAGE_SECURE_SETTINGS",
    "ohos.permission.NOTIFICATION_CONTROLLER",
    "ohos.permission.READ_IMAGEVIDEO",
    "ohos.permission.READ_MEDIA",
    "ohos.permission.START_ABILITIES_FROM_BACKGROUND",
    "ohos.permission.WRITE_MEDIA"
],
  • reqPermissions:应用模块配置中声明的权限列表
  • reqPermissionStates:与上表一一对应;0 通常表示已授权,-1 表示未生效

若缺少 START_ABILITIES_FROM_BACKGROUND,或对应 state 为 -1,就会出现本次 jumpToViewer failed / code: 201。

3. 解决方案

在 Share 应用模块配置的 requestPermissions 中声明该权限,并保证签名配置与安装包一致,使授权状态生效:

ohos.permission.START_ABILITIES_FROM_BACKGROUND

声明后重新安装/刷机,再用 bm dump 确认列表中含该权限且对应 reqPermissionStates 为 0,然后回归:传输成功后应能自动打开图库或文件管理器。

后续同类问题排查建议:

  1. 先确认 com.ohos.oneconnect.share 已正确申请且授权该后台启动权限
  2. 权限正常仍不跳转时,再查图库/文件管理器自身启动日志(区分「Share 没调 startAbility」与「对端 Ability 启动失败」)
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐