背景

“附近的人”、“面对面建群”、“近距离点对点本地聊天”…这几个常见的功能都会出现在各大社交类软件中。可通常情况下,“附近的人”基本都只能发现距离自己几百米甚至几公里以外的人,如何缩小这个距离,实现与数米距离内的人打招呼呢?“面对面建群”如何精确的发现就在自己身边的人呢?如何不经过云服务即可直接通信与好友聊天呢?Nearby Service都可以帮你实现!下面将为大家详细讲解Nearby Service集成教程,助你打造一款更加便捷的社交聊天类应用。

应用场景介绍

这里为大家带来一个集成了Nearby Service的示例应用,这个应用利用Nearby Service能做到发现附近的人,以及基于这个能力可以实现如面对面建群、群聊、私密聊、迁移聊天记录等功能。

  • 附近的人

可以为用户精准的发现附近数米的人,支持用户发现同处一室的朋友,如会议室、展厅、酒吧、咖啡厅等;

  • 面对面建群

利用Nearby Service进行建群,只需在端侧即可完成建群动作,位置精确,只有同处一地的人能够进群。

  • 随心聊

利用Nearby Service可以实现近距离范围内不加好友的群聊,新朋友只需到范围附近即可自动入群;离开对应范围自动退出。

  • 私密聊

利用Nearby Service可以实现近距离本地点对点聊天。通信只在两个设备间进行,数据加密不上云,无需担心信息泄露;在高铁、地铁等信号不好的场所时也可以进行通信。

  • 迁移聊天记录

不仅如此,Nearby Service还提供了强大的文件传输功能。当用户有多个设备需要迁移聊天记录时,可利用Nearby Service的通信接口,实现高速、免流量的数据迁移。

工具准备

  1. 2台安卓手机或更多

  2. 开发工具 Android Studio(3.X or later)

构建示例应用

  • 在Android Studio中导入示例源代码。

  • 注册成为华为开发者。

  • 参考Nearby Service 开发准备在华为应用市场创建一个您的应用。注意:需要下载“agconnect-services.json”文件和参考指导生成签名证书并放置在app/目录下。

  • 使用adb命令将生成的apk文件安装到测试手机。

关键代码

示例应用中使用的接口在官方文档Nearby Service Guides中有详细的介绍。

这个示例应用采用MVP的模式进行构建,如您想查看源代码,请根据代码路径: com\huawei\hms\nearby\im找到相应的类。

1. 附近的人

如下面代码所示NearbyPeoplePresenter类在初始化时需将view对象传入。当调用NearbyPeoplePresenter.findNearbyPeople()发现附近的人时,调用view的接口执行后续的动作。

INearbyPeopleView和后面步骤中的xxxView是一组接口,它们的具体实现是对应的Activity对象,代码路径是:com\huawei\hms\nearby\im\ui\adapter。

public NearbyPeoplePresenter(Context mContext, INearbyPeopleView view) {super(mContext, view);nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {@Overridepublic void onMessageFound(MessageBean messageBean) {// notify view when found someoneview.onMemberChanged(false,messageBean);}@Overridepublic void onMessageLost(MessageBean messageBean) {view.onMemberChanged(true,messageBean);}@Overridepublic void onMsgSendResult(boolean isSucceed, MessageBean item) {view.onLoginResult(isSucceed,item);if (!isSucceed) {handler.postDelayed(() -> findNearbyPeople(),DURATION_RE_LOGIN);}}});handler = new Handler(Looper.getMainLooper());
}
public void findNearbyPeople() {nearbyAgent.broadcastMessage(null,MessageBean.ACTION_TAG_ONLINE);nearbyAgent.startScan();
}

2. 面对面建群

与“附近的人”类似,CreateGroupPresenter.java类在初始化时传入view对象,当调用joinGroup(groupId)接口时会加入该群组,结果会通过调用view的接口返回。

public CreateGroupPresenter(Context mContext, ICreateGroupView view) {super(mContext, view);nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {@Overridepublic void onMessageFound(MessageBean messageBean) {view.onPeopleFound(messageBean);}@Overridepublic void onMessageLost(MessageBean messageBean) {}@Overridepublic void onMsgSendResult(boolean isSucceed, MessageBean item) {view.onJoinGroupResult(isSucceed,item);}});
}public void joinGroup(String groupId) {nearbyAgent.broadcastMessage(groupId,"join group");nearbyAgent.startScan(groupId);
}

3. 随心聊

类GroupChatPresenter.java在初始化时需传入view对象。业务代码调用broadcastMessage(groupId, sendContent)发送消息到指定的群组,groupId为空时不限定群组;调用findMessage(groupId)发现指定群组的消息,发现后调用view接口返回消息。

public GroupChatPresenter(Context mContext, IGroupChatView view) {super(mContext, view);nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() {@Overridepublic void onMessageFound(MessageBean messageBean) {view.onMessageFound(messageBean);}@Overridepublic void onMessageLost(MessageBean messageBean) {}@Overridepublic void onMsgSendResult(boolean isSucceed, MessageBean item) {view.onMsgSendResult(isSucceed,item);}});
}
public void broadcastMessage(String groupId, String sendContent) {nearbyAgent.broadcastMessage(groupId,sendContent);
}public void findMessage(String groupId) {nearbyAgent.startScan(groupId);
}

4. 私密聊

私密聊的实现与上述接口有所不同,类NearbyConnectionPresenter.java提供了4个接口:

  • findNearbyPeople():发现附近的人

  • requestConnect():与对方建立连接

  • sendMessage(String msgStr):发送字符串类型消息

  • sendFile(Uri uri):发送文件

/*** scanAndBroadcasting to find nearby people*/public void findNearbyPeople(){mDiscoveryEngine.startScan(serviceId, new ScanEndpointCallback() {@Overridepublic void onFound(String endpointId, ScanEndpointInfo discoveryEndpointInfo) {Log.d(TAG, "onFound -- Nearby Connection Demo app: onFound endpoint: " + endpointId);view.onFound(endpointId,discoveryEndpointInfo);}@Overridepublic void onLost(String endpointId) {Log.d(TAG, "onLost -- Nearby Connection Demo app: Lost endpoint: " + endpointId);view.onLost(endpointId);}}, scanOption);}/*** request to connect with remote device* @param endpointId the endpointId of remote device*/public void requestConnect(String endpointId) {Log.d(TAG, "requestConnect -- endpoint: " + endpointId);mDiscoveryEngine.requestConnect(myNameStr, endpointId, connectCallback);}/*** Send message ,Data.Type.BYTES*/public MessageBean sendMessage(String msgStr) {MessageBean item = new MessageBean();item.setUserName(CommonUtil.userName);item.setMsg(msgStr);item.setType(MessageBean.TYPE_SEND_TEXT);item.setSendTime(DateUtils.getCurrentTime(DateUtils.FORMAT));Data data = Data.fromBytes(gson.toJson(item).getBytes(Charset.defaultCharset()));mTransferEngine.sendData(mEndpointId, data);return item;}/*** send file ,Data.Type.FILE* @param uri*/public Data sendFile(Uri uri) {Data filePayload;try {ParcelFileDescriptor pfd = mContext.getContentResolver().openFileDescriptor(uri, "r");filePayload = Data.fromFile(pfd);} catch (FileNotFoundException e) {Log.e(Constants.TAG, "File not found, cause: ", e);return null;}String fileName = FileUtil.getFileRealNameFromUri(mContext, uri);String filenameMessage = filePayload.getId() + ":" + fileName;Data filenameBytesPayload = Data.fromBytes(filenameMessage.getBytes(StandardCharsets.UTF_8));mTransferEngine.sendData(mEndpointId, filenameBytesPayload);mTransferEngine.sendData(mEndpointId, filePayload);return filePayload;}

更多详情

  • 华为开发者联盟官网:
    https://developer.huawei.com/consumer/en/hms/huawei-nearbyservice?ha_source=hms1

  • 获取开发指导文档:
    https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides-V5/introduction-0000001050040566-V5?ha_source=hms1

  • 参与开发者讨论请到Reddit社区:https://www.reddit.com/r/HuaweiDevelopers/

  • 下载demo和示例代码请到Github:https://github.com/HMS-Core

  • 解决集成问题请到Stack Overflow:
    https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest


原文链接:
https://developer.huawei.com/consumer/cn/forum/topic/0201415949786580446?fid=18&pid=0301415949786580897
作者:胡椒

NearbyService超简单集成教程get!助你打造一款更加便捷的社交聊天类应用相关推荐

  1. 超简单集成ML kit 实现听写单词播报

    背景   相信我们大家在刚开始学习一门语言的时候都有过听写,现在的小学生学语文的时候一项重要的课后作业就是听写课文中的生词,很多家长们都有这方面的经历.不过一方面这种读单词的动作相对简单,另一方面家长 ...

  2. python语音唤醒_Python实战教程:为女朋友打造一款智能语音闹钟

    Python实战教程:为女朋友打造一款智能语音闹钟 前言 最近学了一些物联网相关的技术,有点心血来潮,寻思自己可以做点什么,恰巧之前听说过一些树莓派的传闻,就想着做一款智能点的闹钟. 需要说明的是,在 ...

  3. 超简单集成HMS ML Kit二代身份证识别,一键实名认证

    前言 就在近期华为HMS ML Kit 发布了1.0.3.30版本,ML Kit在原有通用OCR功能的基础上,又新增了银行卡识别(BCR)和二代身份证识别(ICR).今天小编就给大家介绍一下其中的IC ...

  4. 超简单集成HMS ML套件二代身份证识别,一键实名认证

    前言 就在近期华为HMS ML Kit发布了1.0.3.30版本,ML Kit在原有通用OCR功能的基础上,又添加了银行卡识别(BCR)和二代身份识别(ICR).今天小编就给ML kit除了提供语言相 ...

  5. 超简单集成华为HMS Scankit扫码SDK实现扫一扫二维码

    前言 查看华为开发者联盟网站的机器学习服务业务介绍(https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-int ...

  6. 【转载】超简单集成HMS ML Kit 人脸检测实现可爱2D贴纸

    文章目录 前言 场景 开发前准备 在项目级gradle里添加华为maven仓 在应用级的build.gradle里面加上SDK依赖 在AndroidManifest.xml文件里面申请相机.访问网络和 ...

  7. 超简单集成华为HMS Core MLKit 机器学习服务银行卡识别SDK,一键实现银行卡绑定

    前言 小编前面几期文章分别给大家介绍了使用HMS ML Kit SDK实现微笑抓拍.证件照DIY.拍照翻译的功能开发(链接见文章末尾),本次小编给大家带来的是使用HMS 机器学习服务(ML Kit)银 ...

  8. 超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定

    标题前言 华为HMS MLKit提供的服务越来越多了,除常见的了银行卡识别的功能,大家可能还会疑问日常生活中的银行卡,会员卡可以识别吗,或者某一类证件号识别?也没有问题~但因为不同商家的卡号位置,版面 ...

  9. 超简单集成HMS Scan Kit扫码SDK,轻松实现扫码购

    前言   在前面的文章中,我们向大家介绍了HMS Scan Kit 的快速集成方法以及HMS Scan Kit和其他开源扫码工具的竞争力对比分析,如果没有看到也没关系,文章下方的往期链接中有文章入口. ...

最新文章

  1. mysql触发器 存储过程_mysql触发器和存储过程
  2. 虚拟化容器Docker的安全性讨论
  3. 新人报道,写的东西还请大神们多指导!也希望能让和我一样的同事少走弯路。...
  4. 【August】百度运维+测试面试
  5. MPC(模型预测控制)之二(路径规划)
  6. 用批处理开启或关闭windows 服务
  7. 兼容各个浏览器的H.264播放: H.264+HTML5+FLOWPLAYER+WOWZA+RMTP
  8. js将阿拉伯数字转换成汉字大写
  9. java 类型通配符_通配符类型
  10. 硬盘盘符拒绝访问-问题和解决办法
  11. [分析力学]解题思路 - 拉格朗日方程
  12. AP 计算机 从D到A,8节课完成飞跃的进步----麻省理工老师的学生如何说
  13. 原生Android打造一个炫酷的底部导航栏
  14. 苹果手机10秒解除锁屏_忘记苹果锁屏密码10秒解决 音量键选择wipedata/
  15. Linux极简快速入门|Linux操作系统(四)
  16. 考研日语线上笔记(八):完型易混易考知识点梳理篇
  17. 算法竞赛入门经典 习题6-14
  18. [博学谷学习记录]超强总结,用心分享|人工智能机械学习基础知识KMeans总结分享
  19. 大疆TT无人机编程初体验,教你对拥抱开源的无人机为所欲为!
  20. openoffice安装及使用,linux文件资源下载及windows资源下载

热门文章

  1. access可以连接mysql数据库吗_JDBC连接Access数据库的几种方式介绍
  2. sts 快捷键 /Eclipse 快捷键(sts基本也一样)
  3. 我的世界服务器宝石系统,我的世界1.11.2宝石生存
  4. Github/Gitlab/Gitee徽章生成网站shields.io的使用方法
  5. ATI HD 3650 火旋风 玩家版 显卡试用
  6. 苹果原壁纸高清_抖音头像 | 高清头像图片
  7. 使用mp3tagiconv解决MP3乱码问题
  8. 如何去高大上的下载电影天堂的内容
  9. java library jna_Java JNA 调用dll库
  10. 惠普星 BookPro14参数配置 惠普星 BookPro14评测怎么样