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
相关产品推荐
相关产品推荐

