如何在 C# 中调用 GetCurrentLocation() (Android/Maui)

问题描述 投票:0回答:1

背景: 我有一个前台服务,它使用“RequestLocationUpdates”每 n 秒获取当前 GPS 位置。除非手机处于省电模式并且屏幕保护程序处于活动状态,否则按预期工作。尝试使用 AlarmManager 来解决此问题,应用程序被闹钟唤醒。然后我检查 GPSDateTime 标记,如果旧,我知道手机已休眠,我需要获取 GPS 位置。如果不是那么旧,那么我创建一个新警报。冲洗并重复。

我尝试实现 Xamarin.Essentials 和 Microsoft.Maui.XYZ,但它们不返回位置(可能是由于手机省电模式所致)

我想使用 API 30 中提供的 LocationManager.GetCurrentLocation() 来获取单个 GPS 位置。 GPS 已经“预热”并在手机进入睡眠状态(前台服务)之前进行了修复,因此我不需要花时间等待这部分完成。

问题:最后一个参数IConsumer。如何在 C# 中完成该部分?!?!?

PS:不工作:

{
var location = _locationManager?.GetCurrentLocation(
  LocationManager.GpsProvider,
  null,
  ContextCompat.GetMainExecutor(Application.Context),
  locationCallback);
}

private Consumer<Microsoft.Maui.Devices.Sensors.Location> locationCallback = new MyLocationCallback();

private class MyLocationCallback : Java.Lang.Object, Java.Util.Functions.IConsumer
{
    public void Accept(Java.Lang.Object p0)
    {
        Microsoft.Maui.Devices.Sensors.Location location =
          (Microsoft.Maui.Devices.Sensors.Location)p0;
          if (location != null)
          {
              //Do something with location
          }
   }
}

如何在 Android 中使用 LocationManager#getCurrentLocation Java 示例

https://medium.com/@priyavrat.acharya01/using-new-on-demand-location-update-api-introduced-in-android-11-69c65b3787aaKotlin 示例

我找到了一些 Kotlin 到 C# 或 Java 到 C# 的网站,但它们都没有生成工作代码,或者任何足够接近的东西让我猜测如何做最后一点。

建议?

c# android xamarin gps maui
1个回答
0
投票

using Android.Locations;

public class MyForegroundService : Service
{
    private LocationManager _locationManager;

    public override void OnCreate()
    {
        base.OnCreate();

        _locationManager = (LocationManager)GetSystemService(LocationService);
    }

    private async Task GetCurrentLocationAsync()
    {
        if (Build.VERSION.SdkInt >= BuildVersionCodes.S) // API level 30+
        {
            try
            {
                var location = await Task.Run(() =>
                {
                    _locationManager.GetCurrentLocation(
                        LocationManager.GpsProvider,
                        null,
                        ContextCompat.GetMainExecutor(Application.Context),
                        location =>
                        {
                            if (location != null)
                            {
                                // Handle successful location retrieval
                                // Process location data here (e.g., update UI, store in DB)
                                Console.WriteLine($"Location: Latitude: {location.Latitude}, Longitude: {location.Longitude}");
                            }
                            else
                            {
                                // Handle null location (e.g., GPS disabled)
                                Console.WriteLine("Location unavailable");
                            }
                        });
                    return location; // Location might be null
                });

                if (location != null)
                {
                    // Location retrieved successfully (handle if needed)
                }
                else
                {
                    // Location unavailable (handle if needed)
                }
            }
            catch (SecurityException ex)
            {
                Console.WriteLine($"Security exception: {ex.Message}");
                // Handle location permission issues
            }
        }
        else
        {
            Console.WriteLine("GetCurrentLocation not supported for API level below 30");
            // Handle API level incompatibility (consider alternative methods)
        }
    }

    public override IBinder OnBind(Intent intent)
    {
        return null;
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.