背景: 我有一个前台服务,它使用“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 示例
我找到了一些 Kotlin 到 C# 或 Java 到 C# 的网站,但它们都没有生成工作代码,或者任何足够接近的东西让我猜测如何做最后一点。
建议?
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;
}
}