位置消息
IMKit 基于高德地图 SDK 提供了位置消息,实现了应用内位置共享、位置缩略图与地图预览功能。
- SDK 默认发送的消息包含位置消息内容对象
LocationMessage
(类型标识:RC:LBSMsg
)。 - 实时位置共享也是基于消息实现的。SDK 默认使用类型标识为
RC:RL
、RC:RLStart
、RC:RLJoin
、RC:RLQuit
的消息。
IMKit 默认会话页面未启用位置功能。如需要使用位置功能,可集成 IMKit 位置插件并配置您自己的高德地图 SDK 帐号。
局限
- IMKit 的位置插件目前存在仅支持高德地图 SDK。如需使用其他地图服务,您可以自定义插件,自行构造位置消息并发送。添加自定义插件的方法详见输入区域。
用法
IMKit 从 5.2.3 及之后开始支持 locationKit
插件。如果从低于 5.2.3 的 IMKit 版本升级,请参见下文升级旧版位置插件。
重要
IMKit 5.2.3 - 5.6.6 版本存在已知问题,无法正常发送位置消息。建议您尽快升级到 5.6.7 及之后版本。如果暂时无法升级,可参考知识库文档中的修复方案,详见 解决内置高德地图 ApiKey 失效,导致无法正常发送位置消息的问题。
自行申请高德地图 API Key
IMKit 使用 locationKit
插件发送位置消息时,需要调用高德地图的创建静态图接口,因此您需要申请高德地图申请 Web 服务 API 密钥(Key)。在高德平台创建一个 Web 服务后,可生成 API Key。
集成位置插件
-
集成位置插件库:
本地库文件:从官网下载高德位置相关的库文件。将下载包里
LocationLib
文件夹下的locationKit_<ver>.aar
文件拷贝到项目的libs
目录下,并在应用的build.gradle
中添加依赖。dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
...
}Maven:
// 插件版本需要与主 SDK 版本保持一致。
implementation 'cn.rongcloud.sdk:locationKit:x.y.z'提示各个 SDK 的最新版本号可能不相同,还可能是 x.y.z.h,可前往 融云官网 SDK 下载页面 或 融云的 Maven 代码库 查询。
-
打开应用的
AndroidManifest.xml
文件,把从高德官网获取的 ApiKey 添加到 application 标签的meta-data
里。<meta-data
android:name="com.amap.api.v2.apikey"
android:value="高德地图的 ApiKey" /> -
添加高德隐私协议代码。
集成
locationKit
需要遵守高德地图 隐私合规接口说明,否则会导致应用崩溃。请在您当前应用的隐私协议中添加高德平台隐私政策,在获取用户同意之后,并在第一次调用地图插件功能之前调用以下代码:
// 表示用户同意定位功能隐私协议
AMapLocationClient.updatePrivacyShow(this, true, true);
AMapLocationClient.updatePrivacyAgree(this, true);
// 表示用户同意地图功能隐私协议
MapsInitializer.updatePrivacyShow(this, true, true);
MapsInitializer.updatePrivacyAgree(this, true);
// 表示用户同意搜索功能隐私协议
ServiceSettings.updatePrivacyShow(this, true, true);
ServiceSettings.updatePrivacyAgree(this, true);通过以上步骤,即完成了高德 3D 地图的集成,在扩展面板里会自动生成位置 插件。
-
(可选)配置代码混淆。详见混淆。
发送位置消息
位置插件集成完毕后,在扩展面板里会自动生成位置消息入口。用户点击输入栏右侧 +
号按钮可展开扩展面板,点击位置图标,即可发送位置消息。
集成位置插件后,默认能力如下:
- 单聊会话中点击位置插件时,会有 发送位置和实时位置共享两个功能选项。用户可以选择发送实时位置或发起位置共享。您也可以为单聊会话关闭实时位置共享。
- 群聊会话中默认没有开启 实时位置共享,仅可以发送位置。您可以自行为群聊会话启用该选项。
使用实时位置共享
您可以创建自定义的扩展面板配置,修改是否需要启用实时位置共享。
-
创建自定义的扩展面板配置类
MyExtensionConfig
,继承自DefaultExtensionConfig
,重写其中的getPluginModules()
方法。public class MyExtensionConfig extends DefaultExtensionConfig {
@Override
public List<IPluginModule> getPluginModules(Conversation.ConversationType conversationType, String targetId) {
List<IPluginModule> pluginModules = super.getPluginModules(conversationType,targetId);
ListIterator<IPluginModule> iterator = pluginModules.listIterator();
// 如果
while (iterator.hasNext()) {
IPluginModule integer = iterator.next();
// 删除不支持实时位置共享的 DefaultLocationPlugin
if (integer instanceof DefaultLocationPlugin) {
iterator.remove();
}
}
// 添加支持实时位置共享的 CombineLocationPlugin 扩展项
pluginModules.add(new CombineLocationPlugin());
return pluginModules;
}
} -
SDK 初始化之后,调用以下方法设置自定义的输入配置,SDK 会根据此配置展示扩展面板。
RongExtensionManager.getInstance().setExtensionConfig(new MyExtensionConfig());
您也可以通过修改默认配置。在 res/values
下创建 IMLib
的配置文件 rc_configuration.xml
文件中,添加并调整以下配置,配置需要支持实时位置共享的会话类型。如果需要关闭位置共享功能,可以移除相应的 item
。
<!--实时位置共享会话类型-->
<string-array name="rc_realtime_support_conversation_types" translatable="false">
<item>private</item>
<item>group</item>
</string-array>