简介

HUAWEI OneHop技术是华为终端分布式技术的核心组成部分,是在传统NFC技术的基础上开创性融合创新,通过"一碰"交互的方式成功打通了手机与周边设备间的生态割裂问题,使得手机与周边设备间的协同体验变得更加简洁高效。

本篇将介绍如何借助该技术实现跨设备应用状态同步。

您将会学到什么

通过本篇CodeLab,您将创建Demo Project,并将HUAWEI OneHop的SDK集成到demo上,并借助此SDK实现将手机端和Pad端状态同步。

硬件要求

软件要求

需要的知识点

  1. 整体流程梳理。
  2. 跨设备同步目前支持手机和平板相同应用程序的接入和适配。

    手机端应用:作为业务的发起端和数据源,负责发送同步的数据

    平板端应用:作为业务的接续端,负责接收手机端同步的数据,并将业务状态同步到和手机端一致的情况,从而便于用户操作。

    整体流程如下图所示:

  3. 集成SDK。
  4. 将下载好的sdk包放在app的libs目录下,在app的build.gradle文件中做如下配置:

    另外,建议将app下的build.gradle文件中的minSdkVersion改为28,如下图所示:

    点击同步按钮,如下图所示:

    同步成功后,如下图所示:

  5. 权限声明
  6. 需在AndroidManifest.xml中声明权限。

    AndroidManifest.xml

    <uses-permission android:name="com.huawei.permission.ONEHOP" />
  7. Activity的Intent-filter设置
  8. 请您务必在需要进行使用OneHop功能的Activity组件进行intent-filter的声明,否则对端设备无法拉起您的Activity,导致业务流程无法进行。

    AndroidManifest.xml

    <intent-filter> <action android:name="com.huawei.onehop.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
  9. 注册事件监听:
  10. 此处应用向系统注册OneHop监听接口,启动"一碰"事件监听;此处需要实现实现IOneHopAppCalback.Stub类的onOneHopReceived(String s)方法。该方法在应用成功注册后,当NFC触碰事件发生后,手机侧和Pad侧均会被回调到。

    代码如图所示:

    MainActivity.java

    /** * Thread to register onehop * * @since 2019-11-11 */ private class RegisterThread extends Thread { @Override public void run() { int retCode = HwOneHopSdk.getInstance().registerOneHop(PKG_NAME, HwOneHopSdk.ONEHOP_DATA_TYPE_BUSINESS_CONTINUITY, new IOneHopAppCallback.Stub() { @Override public void onOneHopReceived(String s) throws RemoteException { // 调用OneHop同步接口OneHopData,通知当前触碰事件。 if (TextUtils.isEmpty(s)) { Log.e(TAG, "onOneHopReceived got wrong para"); return; } try { JSONObject jsonObject = new JSONObject(s); boolean isEvent; if (jsonObject.has(HwOneHopSdk.ONEHOP_RECEIVE_TYPE)) { int type = jsonObject.getInt(HwOneHopSdk.ONEHOP_RECEIVE_TYPE); isEvent = type == HwOneHopSdk.ONEHOP_RECEIVE_TYPE_EVENT ? true : false; } else { Log.e(TAG, "the para is false " + s); return; } if (!isEvent) { // pad: receive parameters handleReceive(s); } else { // phone: send parameters handleSend(); } } catch (JSONException e) { Log.e(TAG, "JSON parsed failed " + e.getMessage()); } } }); if (retCode == HwOneHopSdk.ONEHOP_ERR) { Log.e(TAG, "register OneHop error"); } } }
  11. 事件处理:
  12. NFC事件触发后,onOneHopReceived(String s)方法会被回调。此时,应根据传参判断业务发送端(手机)或接收端(Pad),从而进入不同的逻辑处理流程。

    MainActivity.java

    @Override public void onOneHopReceived(String s) throws RemoteException { // 调用OneHop同步接口OneHopData,通知当前触碰事件。 if (TextUtils.isEmpty(s)) { Log.e(TAG, "onOneHopReceived got wrong para"); return; } try { JSONObject jsonObject = new JSONObject(s); boolean isEvent; if (jsonObject.has(HwOneHopSdk.ONEHOP_RECEIVE_TYPE)) { int type = jsonObject.getInt(HwOneHopSdk.ONEHOP_RECEIVE_TYPE); isEvent = type == HwOneHopSdk.ONEHOP_RECEIVE_TYPE_EVENT ? true : false; } else { Log.e(TAG, "the para is false " + s); return; } if (!isEvent) { // pad: receive parameters handleReceive(s); } else { // phone: send parameters handleSend(); } } catch (JSONException e) { Log.e(TAG, "JSON parsed failed " + e.getMessage()); } }
  13. 数据同步:
  14. 在上一步我们判断了此时应用处于发送或是接收流程,那么接下来,我们进行相应的处理。

    发送端发送数据,此时我们调用onOnehopSend(String packageName, JSONObjectpara)接口传输数据,代码如下所示:

    MainActivity.java

    private void handleSend() { Map<String, Object> map = new HashMap<>(); map.put(DATA_STR, "Hello World! " + (count++)); int retCode = HwOneHopSdk.getInstance().oneHopSend(getPackageName(), new JSONObject(map)); if (retCode == HwOneHopSdk.ONEHOP_ERR) { Log.e(TAG, "send failed"); } }

    而接收端则对数据进行进一步处理:

    MainActivity.java

    private void handleReceive(String param) { Message message = new Message(); message.what = MSG_RECEIVE; Bundle bundle = new Bundle(); bundle.putString(MSG_DATA, param); message.setData(bundle); mHandler.sendMessage(message); }
  15. 解除注册:
  16. 在Activity退出时,我们进行解除注册处理,代码如下所示:

    MainActivity.java

    @Override protected void onDestroy() { unregister(); super.onDestroy(); } private void unregister() { int retCode = HwOneHopSdk.getInstance().unregisterOneHop(getPackageName(), HwOneHopSdk.ONEHOP_DATA_TYPE_BUSINESS_CONTINUITY); if (retCode == HwOneHopSdk.ONEHOP_ERR) { Log.d(TAG, "unregister failed"); } }
  1. Demo运行:
  2. 此时请您分别在手机和Pad上均安装该Demo,并且手机打开该Demo。手机打开NFC开关后,触碰Pad键盘NFC标签,确认连接后可以看到Pad上Demo打开并显示您所传递的参数。

干得好,你已经成功完成了Codelab并学到了:

您可阅读以下链接,了解更多关于HUAWEI OneHop的信息
HUAWEI OneHop技术介绍

下载 source code

已复制代码