解决内置高德地图 ApiKey 失效,导致无法正常发送位置消息的问题

描述

融云与高德地图已停止合作, IMSDK 内置的高德地图 API Key 已过期,导致 SDK 无法正常发送内置的位置消息。

具体症状如下:

  • IM SDK 4.X

    • 如果在 Manifest 中配置了客户自行申请的高德地图 API Key,发送地图消息失败。
    • 如果只使用 IM SDK 中高德地图的信息,地图无法定位具体位置,无法执行发送地图消息。
  • IM SDK 5.X

    • 如果只使用 IM SDK 中高德地图的信息,地图无法定位具体位置。
    • 如果使用客户自行申请的高德地图 API Key 发送地图消息没有缩略图。

分析(根因分析、需求分析)

融云 IM SDK 在 4.1.2.16 和 5.6.7 及更早版本的 SDK 中内置的高德地图 API Key 已过期。您需要通过以下任一方式解决该问题:

  • 升级 IM SDK 至 5.6.7 开发版及之后版本。
  • 自行申请高德地图 API Key,以方案二方式替换 SDK 内置的高德地图 API Key。

解决方案

方案一:升级 IM SDK 版本

  • IM SDK 5.6.7 开发版已经修复该问题。建议您及时升级至 5.6.7 或最新版本。
  • IM SDK 5.5.X 稳定版暂未修复该问题。建议您采用方案二

注意:目前无法通过仅升级到 4.X 最新版 IM SDK 解决该问题。使用 4.X 版本的客户可以考虑升级至 5.X 最新版 IM SDK,或者自行替换高德地图 API Key。

方案二:自行替换高德地图 API Key

:exclamation: 注意:替换完成后,只要以下代码未删除,后续升级 IM SDK 后也将继续使用您自己的高德地图 API Key。

自行申请高德地图 ApiKey

IM SDK 调用的是高德地图的创建静态图接口,因此您需要申请高德地图申请 ”Web 服务 API ”密钥(Key)。在高德平台创建一个 Web 服务后,可生成 API Key。

4.X 版本替换方案 A(推荐)

该方案要求 4.X 版本 ≧ 4.1.2.17。

在启动地图插件前,调用 LocationConst.setAMapApiV2Apikey 设置高德地图 API Key。

# LocationConst

// 设置地图ApiKey
public static void setAMapApiV2Apikey(String apikey) {
    AMAP_API_V2_APIKEY = apikey;//类似e09af6a2b26c02086e9216bd07c960ae 但此key需要到高德地图申请,e09af6a2b26c02086e9216bd07c960ae 已经失效
}

4.X 版本替换方案 B

如果您使用的 IM SDK 版本 ≦ 4.1.2.17,并且无法升级,可使用方案 B。

继承 ConversationFragment,重写 onLocationResult

# ConversationFragment

@Override
public void onLocationResult(double lat, double lng, String poi, Uri thumb) {
    String fix_thumb = 把thumb地址的最后面ApiKey换成自己的;
    super.onLocationResult(lat, lng, poi, Uri.parse(fix_thumb));
}

SDK 中地图缩略图地址(thumb)拼接规则如下,您需要把 thumb 地址的最后的 API Key 换成您自行申请的高德地图 API Key。

private String getMapUrl(double latitude, double longitude) {
    return "http://restapi.amap.com/v3/staticmap?location=" + longitude + "," + latitude +
            "&zoom=16&scale=2&size=408*240&markers=mid,,A:" + longitude + ","
            + latitude + "&key=" + "e09af6a2b26c02086e9216bd07c960ae";
}

5.x 版本修复方案

如果您使用的 IM SDK 版本 ≦ 5.6.7,并且无法升级至 5.6.7 开发版或更新版本,可使用该方案。

该方案本质上是将 SDK 拼接地图缩略图地址(thumb)时使用的过期 API Key 换成您自行申请的高德地图 API Key。

  1. 首先,请确保您已参考开发者文档集成对应版本的 LocationKit 插件。集成插件时,确保您正确填写了您自行申请的高德地图 API Key。

    <meta-data
        android:name="com.amap.api.v2.apikey"
        android:value="自行申请高德地图的 ApiKey" />
    
  2. 自定义 AMap2DAdapter ,继承 AMap2DAdapter(AMap3DAdapter处理方式相同),重写 getMapUrl()。在该步骤中,将高德地图缩略图地址中最后面的 ApiKey(e09af6a2b26c02086e9216bd07c960ae)替换成您自行申请的高德地图 API Key。

    # CustomAMap2DAdapter
    
    public class CustomAMap2DAdapter extends AMap2DAdapter{
        @Override
        public String getMapUrl(double latitude, double longitude) {
           return "http://restapi.amap.com/v3/staticmap?location="
                + longitude
                + ","
                + latitude
                + "&zoom=16&scale=2&size=408*240&markers=mid,,A:"
                + longitude
                + ","
                + latitude
                + "&key="
                + "e09af6a2b26c02086e9216bd07c960ae";
        }
    }
    
  3. 调用 LocationSDKManager.getInstance().setCustomAdapter() 设置自定义的 LocationAdapter

    # LocationSDKManager
    
    public void setCustomAdapter(LocationAdapter<? extends View> customAdapter) {
        this.customAdapter = customAdapter;
    }
    

追踪记录

  • 工单号:
  • Jira 号:IMSDK-18000

更多支持

如有疑问,欢迎提交工单