You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:10:36