「附近的人」、「面對面建羣」、「近距離點對點本地聊天」…這幾個常見的功能都會出如今各大社交類軟件中。可一般狀況下,「附近的人」基本都只能發現距離本身幾百米甚至幾千米之外的人,如何縮小這個距離,實現與數米距離內的人打招呼呢?「面對面建羣」如何精確的發現就在本身身邊的人呢?如何不通過雲服務便可直接通訊與好友聊天呢?Nearby Service均可以幫你實現!下面將爲你們詳細講解Nearby Service集成教程,助你打造一款更加便捷的社交聊天類應用。java
這裏爲你們帶來一個集成了Nearby Service的示例應用,這個應用利用Nearby Service能作到發現附近的人,以及基於這個能力能夠實現如面對面建羣、羣聊、私密聊、遷移聊天記錄等功能。git
能夠爲用戶精準的發現附近數米的人,支持用戶發現同處一室的朋友,如會議室、展廳、酒吧、咖啡廳等;github
面對面建羣json
利用Nearby Service進行建羣,只需在端側便可完成建羣動做,位置精確,只有同處一地的人可以進羣。 app
利用Nearby Service能夠實現近距離範圍內不加好友的羣聊,新朋友只需到範圍附近便可自動入羣;離開對應範圍自動退出。ide
利用Nearby Service能夠實現近距離本地點對點聊天。通訊只在兩個設備間進行,數據加密不上雲,無需擔憂信息泄露;在高鐵、地鐵等信號很差的場所時也能夠進行通訊。工具
不只如此,Nearby Service還提供了強大的文件傳輸功能。當用戶有多個設備須要遷移聊天記錄時,可利用Nearby Service的通訊接口,實現高速、免流量的數據遷移。oop
2檯安卓手機或更多post
在Android Studio中導入示例源代碼。開發工具
註冊成爲華爲開發者。
參考Nearby Service 開發準備在華爲應用市場建立一個您的應用。注意:須要下載「agconnect-services.json」文件和參考指導生成簽名證書並放置在app/目錄下。
示例應用中使用的接口在官方文檔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() { @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的接口返回。
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接口返回消息。
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):發送字符串類型消息
/** * 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
原文連接:
https://developer.huawei.com/consumer/cn/forum/topic/0201415949786580446?fid=18&pid=0301415949786580897做者:胡椒