【发布时间】:2021-10-10 22:52:01
【问题描述】:
我正在使用 CrossGeolocator 插件在 Android 的 Xamarin Forms 应用程序中订阅位置更新(对于 iOS,即使应用程序在后台,位置更新也会继续)。
我实现了一个前台服务,这样即使应用程序进入后台,我也可以继续获取位置。
据我了解,如果我在前台服务中收听位置更新,我应该能够获得位置更新。
但是,当应用程序进入后台时,我没有获得位置更新。
我的服务数据源的 StartCommand:
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
Notification notif = DependencyService.Get<INotification>().ReturnNotif();
StartForeground(ServiceRunningNotifID, notif);
CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(10), 0, true, new Plugin.Geolocator.Abstractions.ListenerSettings
{
ActivityType = ActivityType.Other,
PauseLocationUpdatesAutomatically = false,
AllowBackgroundUpdates = true,
DeferLocationUpdates = false,
ListenForSignificantChanges = false,
});
CrossGeolocator.Current.PositionChanged += PositionChanged;
CrossGeolocator.Current.PositionError += PositionError;
return StartCommandResult.Sticky;
}
还有事件:
private void PositionError(object sender, PositionErrorEventArgs e)
{
Console.WriteLine($"{e.Error}");
}
private void PositionChanged(object sender, PositionEventArgs e)
{
Console.WriteLine($"{e.Position.Latitude}, {e.Position.Longitude}");
}
这些事件仅在应用处于活动状态时触发。服务启动,设备显示服务正在运行的通知标志。
我已分配所需的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
任何人都可以对实现有所了解吗? 如果需要,我可以提供额外的代码。
【问题讨论】:
标签: android xamarin.forms geolocation foreground-service xamarin.essentials