HarmonyOS之基于华为分享的服务分享接入

一、简介
① 业务流程
  • 原子化服务所提供的便捷服务,可以通过接入华为分享实现近距离快速分享,使便捷服务可以精准快速的推送至接收方,降低用户触达服务的成本,提升用户体验。
  • 相比于传统的社交软件分享,分享双方无需建立好友关系,接收方无需提前安装承载服务的安装包,即可享受原生的服务体验。
  • 基于华为分享的服务分享用户业务流程示例:
    • 分享方选择要分享的服务;
    • 选择“华为分享”作为分享途径;
    • 选择分享的接收方;
    • 接收方直接打开服务或在用户确认后打开服务:
      • 当分享方和接收方是同帐号时,直接打开服务详情界面;
      • 当分享方和接收方是无帐号或跨帐号时,接收方弹出卡片简介,用户点击卡片中的“打开”按钮后,进入服务详情界面。
  • 基于华为分享的服务分享流程图:

在这里插入图片描述

② 运作机制
  • 基于华为分享的服务分享工作原理如下图所示:

在这里插入图片描述

  • 服务分享原理说明:
    • 如果分享方与接收方的华为帐号相同,则分享后会在接收方直接为用户打开服务。
    • 如果分享方与接收方无帐号或跨帐号,则分享后会首先在接收方弹出卡片为用户简述分享内容,用户确认后才会打开服务。
二、服务接入华为分享步骤
  • 集成 IDL 接口,用于建立分享方与华为分享的交互通道,完成后续服务分享过程。
    在“java”目录同级目录创建“idl”接口目录(可手动添加或通过 DevEco Studio 创建):com/huawei/hwshare/third(固定路径),然后创建名为 IHwShareCallback.idl 和 IHwShareService.idl 的 IDL 文件。
	IHwShareCallback.idl :
	interface com.huawei.hwshare.third.IHwShareCallback {
	    [oneway] void notifyState([in] int state);
	}
	
	IHwShareService.idl :
	sequenceable ohos.interwork.utils.PacMapEx;
	interface com.huawei.hwshare.third.IHwShareCallback;
	
	interface com.huawei.hwshare.third.IHwShareService {
	    int startAuth([in] String appId, [in] IHwShareCallback callback);
	    int shareFaInfo([in] PacMapEx pacMapEx);
	}
  • 创建 ShareFaManager 类,用于管理分享方与华为分享的连接通道和数据交互:
	import com.huawei.hwshare.third.HwShareCallbackStub;
	import com.huawei.hwshare.third.HwShareServiceProxyimport ohos.aafwk.ability.IAbilityConnection;
	import ohos.aafwk.content.Intent;
	import ohos.app.Context;
	import ohos.bundle.ElementName;
	import ohos.eventhandler.EventHandler;
	import ohos.eventhandler.EventRunner;
	import ohos.interwork.utils.PacMapEx;
	import ohos.rpc.IRemoteObject;
	import ohos.rpc.RemoteException;
	import ohos.hiviewdfx.HiLog;
	import ohos.hiviewdfx.HiLogLabel;
	
	public class ShareFaManager {
	    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, "ShareFa");
	
	    private static final String LOG_FORMAT = "%{public}s: %{public}s";
	
	    public static final String HM_FA_ICON = "ohos_fa_icon";
	
	    public static final String HM_FA_NAME = "ohos_fa_name";
	
	    public static final String HM_ABILITY_NAME = "ohos_ability_name";
	
	    public static final String HM_BUNDLE_NAME = "ohos_bundle_name";
	
	    public static final String SHARING_FA_TYPE = "sharing_fa_type";
	
	    public static final String SHARING_THUMB_DATA = "sharing_fa_thumb_data";
	
	    public static final String SHARING_CONTENT_INFO = "sharing_fa_content_info";
	
	    public static final String SHARING_EXTRA_INFO = "sharing_fa_extra_info";
	
	    private static final String TAG = "ShareHmFaManager";
	
	    private static final String SHARE_PKG_NAME = "com.huawei.android.instantshare";
	
	    private static final String SHARE_ACTION = "com.huawei.instantshare.action.THIRD_SHARE";
	
	    private static final long UNBIND_TIME = 20*1000L;
	
	    private Context mContext;
	
	    private String mAppId;
	
	    private PacMapEx mSharePacMap;
	
	    private static ShareFaManager sSingleInstance;
	
	    private HwShareServiceProxy mShareService;
	
	    private boolean mHasPermission = false;
	
	    private EventHandler mHandler = new EventHandler(EventRunner.getMainEventRunner());
	
	    private final IAbilityConnection mConnection = new IAbilityConnection() {
	        @Override
	        public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) {
	        HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityConnectDone success.");
	        mHandler.postTask(()->{
	            mShareService = new HwShareServiceProxy(iRemoteObject);
	                try {
	                    mShareService.startAuth(mAppId, mFaCallback);
	                } catch (RemoteException e) {
	                    HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "startAuth error.");
	                }
	                });
	            }
	
	            @Override
	            public void onAbilityDisconnectDone(ElementName elementName, int i) {
	                HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityDisconnectDone.");
	                mHandler.postTask(()->{
	                    mShareService = null;
	                    mHasPermission = false;
	                    });
	            }
	    };
	
	    private Runnable mTask = () -> {
	        if (mContext != null && mShareService != null) {
	            mContext.disconnectAbility(mConnection);
	            mHasPermission = false;
	            mShareService = null;
	        }
	    };
	
	    private final HwShareCallbackStub mFaCallback = new HwShareCallbackStub("HwShareCallbackStub") {
	        @Override
	        public void notifyState(int state) throws RemoteException {
	            mHandler.postTask(()->{
	                HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "notifyState: " + state);
	                if (state == 0) {
	                    mHasPermission = true;
	                    if (mSharePacMap != null) {
	                        shareFaInfo();
	                    }
	                }
	            });
	        }
	    };
	
	    /**
	     * 单例模式获取ShareFaManager的实例对象
	     *
	     * @param context 程序Context
	     * @return ShareFaManager实例对象
	     */
	    public static synchronized ShareFaManager getInstance(Context context) {
	        if (sSingleInstance == null && context != null) {
	            sSingleInstance = new ShareFaManager(context.getApplicationContext());
	        }
	        return sSingleInstance;
	    }
	
	    private ShareFaManager(Context context) {
	        mContext = context;
	    }
	
	    private void shareFaInfo() {
	        if (mShareService == null) {
	            return;
	        }
	        if (mHasPermission) {
	            HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "start shareFaInfo.");
	            try {
	                mShareService.shareFaInfo(mSharePacMap);
	                mSharePacMap = null;
	            } catch (RemoteException e) {
	                HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "shareFaInfo error.");
	            }
	        }
	        // 不使用时断开
	        mHandler.postTask(mTask, UNBIND_TIME);
	    }
	
	    /**
	     * 用于分享服务
	     *
	     * @param appId 开发者联盟网站创建原子化服务时生成的appid
	     * @param pacMap 服务信息载体
	     */
	    public void shareFaInfo(String appId, PacMapEx pacMap) {
	        if (mContext == null) {
	            return;
	        }
	        mAppId = appId;
	        mSharePacMap = pacMap;
	        mHandler.removeTask(mTask);
	        shareFaInfo();
	        bindShareService();
	    }
	
	    private void bindShareService() {
	        if (mShareService != null) {
	            return;
	        }
	        HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "start bindShareService.");
	        Intent intent = new Intent();
	        Operation operation = new Intent.OperationBuilder()
	            .withDeviceId("")
	            .withBundleName(SHARE_PKG_NAME)
	            .withAction(SHARE_ACTION)
	            .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
	            .build();
	        intent.setOperation(operation);
	        mContext.connectAbility(intent, mConnection);
	    }
	}
  • 封装服务分享数据,调用 ShareFaManager 封装的接口完成服务的分享:
	PacMapEx pacMap = new PacMapEx();
	pacMap.putObjectValue(ShareFaManager.SHARING_FA_TYPE, 0);
	pacMap.putObjectValue(ShareFaManager.HM_BUNDLE_NAME, getBundleName());
	pacMap.putObjectValue(ShareFaManager.SHARING_EXTRA_INFO, "xxxxxxxx");
	pacMap.putObjectValue(ShareFaManager.HM_ABILITY_NAME, XxxAbility.class.getName());
	pacMap.putObjectValue(ShareFaManager.SHARING_CONTENT_INFO, "xxxxxxx");
	pacMap.putObjectValue(ShareFaManager.SHARING_THUMB_DATA, picByte);
	pacMap.putObjectValue(ShareFaManager.HM_FA_ICON, iconByte);
	pacMap.putObjectValue(ShareFaManager.HM_FA_NAME, "FAShareDemo");
	// 第一个参数为appid,在华为AGC创建原子化服务时自动生成
	ShareFaManager.getInstance(MainAbilitySlice.this).shareFaInfo("xxxxxxxxxx", pacMap);
  • ShareFaManager 的常量字段说明:
常量字段类型描述
ShareFaManager.SHARING_FA_TYPEint分享的服务类型,当前只支持默认值0,非必选参数。如果不传递此参数,则接收方默认赋值为0
ShareFaManager.HM_BUNDLE_NAMEString分享的服务的bundleName,最大长度1024,必选参数
ShareFaManager.SHARING_EXTRA_INFOString携带的额外信息,可传递到被拉起的服务界面 ,最大长度10240,非必选参数
ShareFaManager.HM_ABILITY_NAMEString分享的服务的Ability类名,最大长度1024,必选参数
ShareFaManager.SHARING_CONTENT_INFOString卡片展示的服务介绍信息,最大长度1024,必选参数
ShareFaManager.SHARING_THUMB_DATAbyte[]卡片展示服务介绍图片,最大长度153600,必选参数
ShareFaManager.HM_FA_ICONbyte[]服务图标,如果不传递此参数,取分享方默认服务图标,最大长度32768,非必选参数
ShareFaManager.HM_FA_NAMEString卡片展示的服务名称,最大长度1024,非必选参数。如果不传递此参数,取分享方默认服务名称
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
华为鸿蒙HarmonyOS开发整理资料汇总,共38份。 1学前必读:HarmonyOS学习资源主题分享 2学前必读:OpenHarmony-联盟生态资料合集 3-1.HarmonyOS概述:技术特性 3-2.HarmonyOS概述:开发工具与平台 3-3.HarmonyOS概述:系统安全 3-4.HarmonyOS概述:系统定义 3-5.HarmonyOS概述:下载与安装软件 3-6.HarmonyOS概述:应用开发基础知识 3-7.HarmonyOS概述:最全HarmonyOS文档和社区资源使用技巧 4-1.生态案例:【开发者说】重塑经典,如何在HarmonyOS手机上还原贪吃蛇游戏 4-2.生态案例:HarmonyOLabo涂鸦鸿蒙亲子版 4-3.生态案例:HarmonyOS分镜头APP案例 4-4.生态案例:HarmonyOS时光序历史学习案例 4-5.生态案例:HarmonyOS先行者说 宝宝巴士携手HarmonyOS共同打造儿童教育交互新体验 4-6.生态案例:HarmonyOS智能农场物联网连接实践 4-7.生态案例:分布式开发样例,带你玩转多设备 4-8.生态案例:华为分布式日历应用开发实践 5-1.【Codelab】HarmonyOS基于图像模块实现图库图片的四种常见操作 5-2.【CodeLab】手把手教你创建第一个手机“Hello World” 5-3.【Codelab】如此简单!一文带你学会15个HarmonyOS JS组件 5-4.【Codelab】懒人“看”书新法—鸿蒙语音播报,到底如何实现? 5-5.【Codelab】基于AI通用文字识别的图像搜索,这波操作亮了 5-6.【Codelab】开发样例概览 6-1.技术解读之HarmonyOS轻量JS开发框架与W3C标准差异分析 6-2.技术解读之HarmonyOS驱动加载过程分析 6-3.技术解读之HarmonyOS组件库使用实践 6-4.技术解读之华为架构师解读:HarmonyOS低时延高可靠消息传输原理 6-5.技术解读之解密HarmonyOS UI框架 6-6.技术解读之如何从OS框架层面实现应用服务功能解耦 7-1.常见问题之HarmonyOS服务的设计与开发解析 7-2.常见问题之Java开发 7-3.常见问题之JS开发 7-4.常见问题之模拟器登录 7-5.常见问题之模拟器运行 7-6.常见问题之如何使用JsJava开发HarmonyOS UI 7-7.常见问题之应用配置 7-8.常见问题之预览器运行 8【视频合集】入门到进阶视频学习资料合集30+
基于HarmonyOS的系统开发极大地展示了华为公司在操作系统领域的创新和实力。HarmonyOS是一款面向全场景的分布式操作系统,具有分布式架构、统一调度和安全可靠等特点,能够实现从智能手机到智能家居、汽车、办公设备等各种终端设备的无缝连接和协同工作。 首先,基于HarmonyOS的系统具有强大的分布式能力,可以实现智能设备之间的高效通信和资源共享。用户可以通过HarmonyOS将手机、电视、音箱等设备连成一个整体,实现统一控制和信息共享。例如,用户可以通过手机上的应用控制家中的智能家居设备,也可以将手机上的音乐直接传输到音箱上播放。 其次,基于HarmonyOS的系统具有统一调度的特点,能够在不同终端设备上实现应用的无缝切换和迁移。用户可以将正在进行的任务从手机上切换到电视,而不会有任何中断。此外,HarmonyOS还能够根据用户的使用习惯和场景需求,自动分配和调度资源,以提供更流畅、高效的使用体验。 最重要的是,基于HarmonyOS的系统注重安全可靠性,为用户提供更高的数据安全保护。HarmonyOS采用了多种安全技术和机制,包括严格的权限管理、安全沙箱和可信执行环境等。这些措施可以有效防止恶意软件和黑客攻击,保障用户的个人隐私和财产安全。 总之,基于HarmonyOS的系统是华为公司在操作系统领域的一次重要突破和创新。它以其强大的分布式能力、统一调度和安全可靠性等特点,为用户提供了更多便利和安全的智能体验,将会在未来的智能化时代发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值