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

Android 13环境下Xamarin/MAUI打开谷歌地图时如何避免进入分屏模式

Android 13环境下Xamarin/MAUI打开谷歌地图时如何避免进入分屏模式

我太懂你遇到的糟心事了——升级Android 13后,三星设备上用await Map.OpenAsync(location, options);打开谷歌地图就自动进入分屏,谷歌地图在上自己的App在下,而Pixel模拟器完全没这问题,Xamarin和MAUI版本的App都中招。之前试的几种方法要么没用要么还搞出黑屏,我来给你捋清楚原因,再给个靠谱的解决方案:

为啥之前的方法不管用?

  • 设置ResizeableActivity = false:这个属性只管你自己的App能不能分屏,对谷歌地图这种外部应用完全无效,所以才会出现你的App黑屏、谷歌地图还是分屏的尴尬情况。
  • 重写StartActivity移除LaunchAdjacent:这个操作对AppInfo.ShowSettingsUI()有用,是因为系统设置页属于你的App发起的内部关联操作,Intent会经过你重写的方法;但Map.OpenAsync是封装好的第三方调用,它内部创建的Intent根本没经过你这个拦截逻辑,所以修改Flag等于做了无用功。

可行解决方案:手动构建Intent强制全屏

既然封装好的方法没法让我们干预Intent的设置,那咱们就自己动手构建打开谷歌地图的Intent,直接指定启动Flags强制全屏:

自定义全屏打开谷歌地图的方法(Xamarin/MAUI通用)

在你的Android项目里加这个方法,替换原来的Map.OpenAsync调用:

public void OpenGoogleMapInFullScreen(double latitude, double longitude, MapLaunchOptions options = null)
{
    // 构建谷歌地图的geo协议链接,支持标记、缩放等自定义参数(可根据你的需求调整)
    string geoUri = $"geo:{latitude},{longitude}";
    if (options != null)
    {
        // 示例:添加地点标记和名称
        if (!string.IsNullOrEmpty(options.Name))
        {
            geoUri += $"q:{latitude},{longitude}({Uri.EscapeDataString(options.Name)})";
        }
        // 示例:设置地图缩放级别(z参数范围1-21)
        if (options.ZoomLevel.HasValue)
        {
            geoUri += $"&z={options.ZoomLevel.Value}";
        }
    }

    var intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(geoUri));
    // 指定谷歌地图包名,确保打开的是官方应用而非其他地图
    intent.SetPackage("com.google.android.apps.maps");

    // 添加关键Flags,强制全屏启动
    intent.AddFlags(ActivityFlags.NewTask);
    intent.AddFlags(ActivityFlags.LaunchSingleTop);
    // 明确移除相邻启动Flag,彻底阻止分屏
    intent.RemoveFlags(ActivityFlags.LaunchAdjacent);

    // 先检查设备是否安装了谷歌地图
    if (intent.ResolveActivity(Android.App.Application.Context.PackageManager) != null)
    {
        Android.App.Application.Context.StartActivity(intent);
    }
    else
    {
        // 可选:没有谷歌地图时的兜底处理,比如提示用户安装
    }
}

调用方式

把原来的await Map.OpenAsync(location, options);替换成:

OpenGoogleMapInFullScreen(location.Latitude, location.Longitude, options);

这个方法为啥能行?

我们绕开了封装方法的限制,手动构建Intent并直接设置启动规则,明确告诉系统要以全屏模式启动谷歌地图,同时指定包名避免其他地图应用干扰。这个操作能直接覆盖三星Android 13的默认分屏启动逻辑,让谷歌地图在单独的全屏窗口打开。

备注:内容来源于stack exchange,提问作者user1431743

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 11:27:44