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

如何在MAUI应用中实现页面打开时通过SMS分享谷歌地图实时位置追踪?

MAUI实现页面打开时自动通过SMS分享谷歌地图实时位置链接方案

权限配置

首先需要在各平台配置必要的权限:

Android (Platforms/Android/AndroidManifest.xml)

添加以下权限声明:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 如需后台持续获取位置,添加以下权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

iOS (Platforms/iOS/Info.plist)

添加权限描述:

<key>NSLocationWhenInUseUsageDescription</key>
<string>需要获取您的位置以分享实时位置</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要在后台获取您的位置以保持实时分享</string>
<key>NSMessagesUsageDescription</key>
<string>需要发送SMS分享位置链接</string>

核心实现代码

创建一个位置共享服务类,封装权限检查、位置获取、链接生成和SMS发送逻辑:

using Microsoft.Maui.Devices.Sensors;
using Microsoft.Maui.ApplicationModel;
using System;
using System.Threading.Tasks;

public class LocationSharingService
{
    private bool _isSharing;
    private readonly string _recipientPhoneNumber = "替换为接收方手机号"; // 修改为目标手机号

    // 检查并请求必要权限
    private async Task<bool> ValidatePermissions()
    {
        // 位置权限
        var locationStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
        if (locationStatus != PermissionStatus.Granted)
        {
            locationStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
            if (locationStatus != PermissionStatus.Granted) return false;
        }

        // SMS权限
        var smsStatus = await Permissions.CheckStatusAsync<Permissions.Sms>();
        if (smsStatus != PermissionStatus.Granted)
        {
            smsStatus = await Permissions.RequestAsync<Permissions.Sms>();
            if (smsStatus != PermissionStatus.Granted) return false;
        }

        return true;
    }

    // 获取当前位置并生成谷歌地图链接
    private async Task<string> GenerateGoogleMapsLink()
    {
        var location = await Geolocation.GetLastKnownLocationAsync();
        if (location == null)
        {
            location = await Geolocation.GetLocationAsync(new GeolocationRequest
            {
                DesiredAccuracy = GeolocationAccuracy.High,
                Timeout = TimeSpan.FromSeconds(10)
            });
        }

        if (location == null) return null;

        // 注意:此为静态位置链接,若要实现真正的实时追踪,需结合谷歌Location Sharing API
        // 谷歌实时共享API需要用户授权并生成专属共享链接,需自行对接谷歌开发者服务
        return $"https://www.google.com/maps?q={location.Latitude},{location.Longitude}&ll={location.Latitude},{location.Longitude}&z=15";
    }

    // 发送SMS消息
    private async Task SendLocationSms(string link)
    {
        try
        {
            await Sms.Default.SendAsync(_recipientPhoneNumber, $"我的实时位置:{link}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"SMS发送失败:{ex.Message}");
        }
    }

    // 启动位置共享流程
    public async Task StartSharing()
    {
        if (_isSharing) return;

        if (!await ValidatePermissions())
        {
            Console.WriteLine("权限不足,无法启动位置分享");
            return;
        }

        _isSharing = true;
        var locationLink = await GenerateGoogleMapsLink();
        
        if (string.IsNullOrEmpty(locationLink))
        {
            Console.WriteLine("无法获取有效位置");
            _isSharing = false;
            return;
        }

        await SendLocationSms(locationLink);

        // 如需持续更新位置,取消注释以下代码监听位置变化
        // Geolocation.LocationChanged += OnLocationUpdated;
    }

    // 位置更新事件处理(可选)
    private void OnLocationUpdated(object sender, GeolocationLocationChangedEventArgs e)
    {
        var updatedLink = $"https://www.google.com/maps?q={e.Location.Latitude},{e.Location.Longitude}&ll={e.Location.Latitude},{e.Location.Longitude}&z=15";
        // 建议添加频率控制,避免频繁发送SMS
        // SendLocationSms(updatedLink);
    }

    // 停止位置共享
    public void StopSharing()
    {
        _isSharing = false;
        // Geolocation.LocationChanged -= OnLocationUpdated;
    }
}

页面触发逻辑

在目标页面的生命周期方法中调用共享服务:

public partial class ShareLocationPage : ContentPage
{
    private readonly LocationSharingService _sharingService;

    public ShareLocationPage()
    {
        InitializeComponent();
        _sharingService = new LocationSharingService();
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();
        await _sharingService.StartSharing();
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        _sharingService.StopSharing();
    }
}

关键说明

  1. 实时追踪的局限性:上述代码生成的是静态位置链接,若要实现接收方实时追踪发起方位置,需对接谷歌Location Sharing API,该API允许生成用户专属的实时共享链接,接收方打开后可查看动态位置更新。
  2. SMS发送频率:若启用位置持续更新,需添加频率控制(如定时发送),避免因频繁发送SMS被运营商限制。
  3. 平台兼容性:部分Android机型可能需要额外配置SMS发送权限,iOS上需确保用户授予消息发送权限。

内容的提问来源于stack exchange,提问作者vineeth pv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:45:10