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

38次阅读

共计 5810 个字符,预计需要花费 15 分钟才能阅读完成。

背景

“左近的人”、“面对面建群”、“近距离点对点本地聊天”…这几个常见的性能都会呈现在各大社交类软件中。可通常状况下,“左近的人”根本都只能发现间隔本人几百米甚至几公里以外的人,如何放大这个间隔,实现与数米间隔内的人打招呼呢?“面对面建群”如何准确的发现就在本人身边的人呢?如何不通过云服务即可间接通信与好友聊天呢?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() {
 
        @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): 发送字符串类型音讯
  • sendFile(Uri uri):发送文件
/**
  * 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

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

正文完
 0