实现地理位置消息功能
更新时间: 2024/09/27 10:50:00
自 IM UIKit v1.1.0 开始,IM UIKit 的会话消息模块(nim_chatkit_ui
)支持地理位置消息功能。
功能介绍
IM UIKit 的默认界面已经实现了地理位置消息的发送按钮、UI 展示和接收逻辑。仅需三步,即可在您的应用实现地理位置消息的收发。
如果您的应用不需要地理位置消息的发送按钮,您也可以将其从界面上移除。
前提条件
开始集成地理位置消息功能前,请确保:
- 已集成会话消息界面。
- 已在高德开放平台获取到高德地图的 API Key。
- 确保已经开通了地图和定位权限。
实现方法
实现地理位置消息收发
步骤1:配置权限
由于高德地图 Flutter 版本的限制,Android 需要先集成原生的高德 SDK,再进行权限配置。
-
在 Project 的 build.gradle 文件配置 repositories,添加 maven 仓库地址。
allprojects { repositories { mavenCentral() } }
-
在主工程的 build.gradle 文件配置 dependencies。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //高德地图功能 implementation 'com.amap.api:3dmap:latest.integration' //搜索功能 implementation 'com.amap.api:search:latest.integration' }
-
在 Android 的 manifest 文件中配置权限以及高德定位需要的 Service。
xml
<!-- 地图定位权限 --> <!--允许获取精确位置,精准定位必选--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!--允许获取粗略位置,粗略定位必选--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--用于申请调用A-GPS模块,卫星定位加速--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!--允许写设备缓存,用于问题排查--> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 高德地图定位 --> <!-- 配置高德定位Service --> <service android:name="com.amap.api.location.APSService"/>
-
在 Info.plist 文件中配置位置权限。
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>请点击“允许”以允许访问。 若不允许,将无法使用位置信息功能。</string> <key>NSLocationAlwaysUsageDescription</key> <string>请点击“允许”以允许访问。 若不允许,将无法使用位置信息功能。</string> <key>NSLocationWhenInUseUsageDescription</key> <string>请点击“允许”以允许访问。 若不允许,将无法使用位置信息功能。</string>
-
在 Podfile 文件中增加位置权限。
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] 'PERMISSION_LOCATION=1',
步骤2:引入位置插件
在 Flutter 的 yaml 文件中引入地理位置插件。
nim_chatkit_location: ^x.x.x
步骤3:配置高德地图需要的appkey
请参考 demo 的 config.dart 文件配置。
dart//高德Android Key
static const AMapAndroid = 'your amap android key';
//高德IOS Key
static const AMapIOS = 'your amap ios key';
//高德Web服务端 Key,用于生成静态图
static const AMapWeb = 'your amap web key';
步骤4:初始化位置插件
- 9.7.1 之前的版本
在合适的地方初始化位置组件,可参考 demo 的 home_page.dart 文件。
dart//如果需要使用位置消息设置,需要设置ChatKitLocationProviderImpl
ChatKitClient.instance.chatUIConfig.locationProvider =
ChatKitLocationProviderImpl.instance;
ChatKitLocationProviderImpl.instance.initLocationMap(
aMapAndroidKey: IMDemoConfig.AMapAndroid,
aMapIOSKey: IMDemoConfig.AMapIOS,
aMapWebKey: IMDemoConfig.AMapWeb);
- 9.7.1 之后的版本
参考 demo,建议在 main 中初始化位置插件。
dartvoid main() {
//. . .
WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) {
//初始化位置消息插件
ChatKitLocation.instance.init(
aMapAndroidKey: IMDemoConfig.AMapAndroid,
aMapIOSKey: IMDemoConfig.AMapIOS,
aMapWebKey: IMDemoConfig.AMapWeb);
});
//. . .
}
至此,完成地理位置消息的接入,完成之后会在输入框的更多选项中显示地理位置消息的发送按钮。
如果不在 ymal 文件引入地理位置组件,初始化后输入框的更多选项中不会显示发送位置消息按钮。
常见问题
为什么地图没有定位到当前位置?
-
确认手机已打开定位服务。
-
确认应用已授权位置权限。
-
确认在日志中是否出现如下类似报错:
定位失败, code:7 -->> KEY错误
。一般导致该错误的原因为高德地图配置打包机器的 SHA1 和高德控制台配置的不一致。将日志上打印出来的 SHA1 配置到高德地图即可解决,更多详情参见高德开放平台的常见问题。
其他高德地图问题
如遇到其他报错,可参考高德开放平台的错误码列表和高德开放平台的常见问题进行排查。