首页 > 解决方案 > Xamarin Forms 使用 CrossGeolocator 获取前台服务位置更新

问题描述

我正在使用 CrossGeolocator 插件订阅 Xamarin Forms 应用程序中的位置更新,适用于 Android(对于 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" />

任何人都可以对实施情况有所了解吗?如果需要,我可以提供额外的代码。

标签: androidxamarin.formsgeolocationforeground-servicexamarin.essentials

解决方案


我通过添加以下内容找到了解决方案:

ForegroundServiceType = ForegroundService.TypeDataSync | ForegroundService.TypeLocation

作为前台服务中的服务属性

[Service(ForegroundServiceType = ForegroundService.TypeDataSync | ForegroundService.TypeLocation)]
public class LocationForegroundService : Service
{
    ...
}

推荐阅读