HUAWEI OneHop技术是华为终端分布式技术的核心组成部分,是在传统NFC技术的基础上开创性融合创新,通过"一碰"交互的方式成功打通了手机与周边设备间的生态割裂问题,使得手机与周边设备间的协同体验变得更加简洁高效。
本篇将介绍如何借助该技术实现跨设备应用状态同步。
通过本篇CodeLab,您将创建Demo Project,并将HUAWEI OneHop的SDK集成到demo上,并借助此SDK实现将手机端和Pad端状态同步。
跨设备同步目前支持手机和平板相同应用程序的接入和适配。
手机端应用:作为业务的发起端和数据源,负责发送同步的数据
平板端应用:作为业务的接续端,负责接收手机端同步的数据,并将业务状态同步到和手机端一致的情况,从而便于用户操作。
整体流程如下图所示:
将下载好的sdk包放在app的libs目录下,在app的build.gradle文件中做如下配置:
另外,建议将app下的build.gradle文件中的minSdkVersion改为28,如下图所示:
点击同步按钮,如下图所示:
同步成功后,如下图所示:
需在AndroidManifest.xml中声明权限。
AndroidManifest.xml
<uses-permission android:name="com.huawei.permission.ONEHOP" />
请您务必在需要进行使用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>
此处应用向系统注册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");
}
}
}
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());
}
}
在上一步我们判断了此时应用处于发送或是接收流程,那么接下来,我们进行相应的处理。
发送端发送数据,此时我们调用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);
}
在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");
}
}
此时请您分别在手机和Pad上均安装该Demo,并且手机打开该Demo。手机打开NFC开关后,触碰Pad键盘NFC标签,确认连接后可以看到Pad上Demo打开并显示您所传递的参数。
干得好,你已经成功完成了Codelab并学到了:
您可阅读以下链接,了解更多关于HUAWEI OneHop的信息
HUAWEI OneHop技术介绍