背景
“左近的人”、“面对面建群”、“近距离点对点本地聊天”…这几个常见的性能都会呈现在各大社交类软件中。可通常状况下,“左近的人”根本都只能发现间隔本人几百米甚至几公里以外的人,如何放大这个间隔,实现与数米间隔内的人打招呼呢?“面对面建群”如何准确的发现就在本人身边的人呢?如何不通过云服务即可间接通信与好友聊天呢?Nearby Service都能够帮你实现!上面将为大家具体解说Nearby Service集成教程,助你打造一款更加便捷的社交聊天类利用。
利用场景介绍
这里为大家带来一个集成了Nearby Service的示例利用,这个利用利用Nearby Service能做到发现左近的人,以及基于这个能力能够实现如面对面建群、群聊、私密聊、迁徙聊天记录等性能。
- 左近的人
能够为用户精准的发现左近数米的人,反对用户发现同处一室的敌人,如会议室、展厅、酒吧、咖啡厅等;
- 面对面建群
利用Nearby Service进行建群,只需在端侧即可实现建群动作,地位准确,只有同处一地的人可能进群。
- 随心聊
利用Nearby Service能够实现近距离范畴内不加好友的群聊,新敌人只需到范畴左近即可主动入群;来到对应范畴主动退出。
- 私密聊
利用Nearby Service能够实现近距离本地点对点聊天。通信只在两个设施间进行,数据加密不上云,无需放心信息泄露;在高铁、地铁等信号不好的场合时也能够进行通信。
- 迁徙聊天记录
不仅如此,Nearby Service还提供了弱小的文件传输性能。当用户有多个设施须要迁徙聊天记录时,可利用Nearby Service的通信接口,实现高速、免流量的数据迁徙。
工具筹备
- 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。
<code class="java">public NearbyPeoplePresenter(Context mContext, INearbyPeopleView view) { super(mContext, view); nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() { @Override public void onMessageFound(MessageBean messageBean) { // notify view when found someone view.onMemberChanged(false,messageBean); } @Override public void onMessageLost(MessageBean messageBean) { view.onMemberChanged(true,messageBean); } @Override public 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的接口返回。
<code class="java">public CreateGroupPresenter(Context mContext, ICreateGroupView view) { super(mContext, view); nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() { @Override public void onMessageFound(MessageBean messageBean) { view.onPeopleFound(messageBean); } @Override public void onMessageLost(MessageBean messageBean) {} @Override public 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接口返回音讯。
<code class="java">public GroupChatPresenter(Context mContext, IGroupChatView view) { super(mContext, view); nearbyAgent = new NearbyAgent(mContext, new NearbyAgent.INearbyMessageView() { @Override public void onMessageFound(MessageBean messageBean) { view.onMessageFound(messageBean); } @Override public void onMessageLost(MessageBean messageBean) { } @Override public 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):发送文件
<code class="java">/** * scanAndBroadcasting to find nearby people */ public void findNearbyPeople(){ mDiscoveryEngine.startScan(serviceId, new ScanEndpointCallback() { @Override public void onFound(String endpointId, ScanEndpointInfo discoveryEndpointInfo) { Log.d(TAG, "onFound -- Nearby Connection Demo app: onFound endpoint: " + endpointId); view.onFound(endpointId,discoveryEndpointInfo); } @Override public 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