如何使用Flutter实现一键向多人发送位置?
可以通过Flutter实现一键发送自身位置给多个联系人吗?
当然可以实现,核心分为获取当前位置、选择多个联系人、发送位置信息三个关键步骤,下面是具体的实现思路和代码示例:
1. 获取当前位置
使用geolocator包获取设备经纬度,需先处理位置权限:
- 添加依赖到
pubspec.yaml:
dependencies: geolocator: ^10.1.0
- 权限请求与位置获取代码:
import 'package:geolocator/geolocator.dart'; Future<Position> getCurrentLocation() async { bool serviceEnabled; LocationPermission permission; // 检查位置服务状态 serviceEnabled = await Geolocator.isLocationServiceEnabled(); if (!serviceEnabled) { return Future.error('位置服务未开启,请先启用'); } // 检查并请求位置权限 permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { return Future.error('位置权限被拒绝,无法获取位置'); } } if (permission == LocationPermission.deniedForever) { return Future.error('位置权限永久拒绝,请在设置中开启'); } // 返回当前位置 return await Geolocator.getCurrentPosition(); }
2. 选择多个联系人
使用contacts_service包读取设备联系人,搭配permission_handler请求联系人权限,再通过多选组件让用户选择目标联系人:
- 添加依赖:
dependencies: contacts_service: ^0.6.3 permission_handler: ^10.2.0
- 获取联系人列表代码:
import 'package:contacts_service/contacts_service.dart'; import 'package:permission_handler/permission_handler.dart'; Future<List<Contact>> getContacts() async { if (await Permission.contacts.request().isGranted) { return await ContactsService.getContacts(); } else { return Future.error('联系人权限被拒绝,无法读取联系人'); } }
可通过CheckboxListTile组件实现多选界面,将用户勾选的联系人存入列表备用。
3. 发送位置信息给联系人
有两种常用实现方式:
方式一:生成位置链接通过短信批量发送
使用sms包直接发送包含位置链接的短信:
- 添加依赖:
dependencies: sms: ^2.2.0
- 批量发送代码:
import 'package:sms/sms.dart'; void sendLocationViaSms(List<Contact> selectedContacts, Position position) { // 生成Google Maps位置链接 String locationUrl = "https://www.google.com/maps/search/?api=1&query=${position.latitude},${position.longitude}"; SmsSender sender = SmsSender(); for (var contact in selectedContacts) { // 提取联系人手机号(需处理多号码场景) String? phoneNumber = contact.phones?.first?.value; if (phoneNumber != null) { SmsMessage message = SmsMessage(phoneNumber, "我的当前位置:$locationUrl"); sender.sendSms(message); } } }
方式二:唤起系统分享界面发送
使用url_launcher包唤起系统分享框,支持用户一次性选择多个联系人:
- 添加依赖:
dependencies: url_launcher: ^6.1.12
- 唤起分享界面代码:
import 'package:url_launcher/url_launcher.dart'; void shareLocationSystem(Position position) async { String locationUrl = "geo:${position.latitude},${position.longitude}"; final Uri shareUri = Uri.parse("sms:?body=我的当前位置:$locationUrl"); if (await canLaunchUrl(shareUri)) { await launchUrl(shareUri); } else { throw '无法唤起系统分享界面'; } }
注意事项
- 需在iOS的
Info.plist和Android的AndroidManifest.xml中配置对应权限声明 - 需处理联系人无手机号、权限被拒绝等异常场景
- 不同平台对短信、分享的支持存在差异,需做适配测试
内容的提问来源于stack exchange,提问作者Rashikul Islam
相关产品推荐
相关产品推荐

