我正在尝试使应用程序在backgrund中导航用户。我正在运行前台服务。但是对于RequestLocationUpdates我有两个选择:
哪个应用于前台的位置更新?我认为是LocationCallback,但不确定。
提前感谢。
当您使用RequestLocationUpdates
更新前台服务中的位置时,请实现Android.Locations.ILocationListener
界面并实现OnLocationChanged
方法。
这里是一些相关代码
[Service]
public class LocationService : Service, ILocationListener
{
const int SERVICE_RUNNING_NOTIFICATION_ID = 123;
const string NOTIFICATION_CHANNEL_ID = "com.company.app.channel";
readonly string logTag = "LocationService";
IBinder binder;
// Set our location manager as the system location service
protected LocationManager LocMgr = Application.Context.GetSystemService("location") as LocationManager;
// ILocationListener is a way for the Service to subscribe for updates
// from the System location Service
public void OnLocationChanged(Android.Locations.Location location)
{
LocationChanged(this, new LocationChangedEventArgs(location));
// This should be updating every time we request new location updates
// both when teh app is in the background, and in the foreground
Log.Debug(logTag, $"Latitude is {location.Latitude}");
Log.Debug(logTag, $"Longitude is {location.Longitude}");
Log.Debug(logTag, $"Altitude is {location.Altitude}");
Log.Debug(logTag, $"Speed is {location.Speed}");
Log.Debug(logTag, $"Accuracy is {location.Accuracy}");
Log.Debug(logTag, $"Bearing is {location.Bearing}");
}
public void OnProviderDisabled(string provider)
{
ProviderDisabled(this, new ProviderDisabledEventArgs(provider));
}
public void OnProviderEnabled(string provider)
{
ProviderEnabled(this, new ProviderEnabledEventArgs(provider));
}
public void OnStatusChanged(string provider, Availability status, Bundle extras)
{
StatusChanged(this, new StatusChangedEventArgs(provider, status, extras));
}
public event EventHandler<LocationChangedEventArgs> LocationChanged = delegate { };
public event EventHandler<ProviderDisabledEventArgs> ProviderDisabled = delegate { };
public event EventHandler<ProviderEnabledEventArgs> ProviderEnabled = delegate { };
public event EventHandler<StatusChangedEventArgs> StatusChanged = delegate { };
public override void OnCreate()
{
base.OnCreate();
Log.Debug(logTag, "OnCreate called in the Location Service");
}
// This gets called when StartService is called in our App class
[Obsolete("deprecated in base class")]
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
Log.Debug(logTag, "LocationService started");
// Check if device is running Android 8.0 or higher and call StartForeground() if so
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var notification = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
.SetContentTitle(Resources.GetString(Resource.String.app_name))
.SetContentText(Resources.GetString(Resource.String.notification_text))
.SetSmallIcon(Resource.Drawable.notification_icon_background)
.SetOngoing(true)
.Build();
var notificationManager =
GetSystemService(NotificationService) as NotificationManager;
var chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "On-going Notification", NotificationImportance.Min);
notificationManager.CreateNotificationChannel(chan);
StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
}
return StartCommandResult.Sticky;
}
// This gets called once, the first time any client bind to the Service
// and returns an instance of the LocationServiceBinder. All future clients will
// reuse the same instance of the binder
public override IBinder OnBind(Intent intent)
{
Log.Debug(logTag, "Client now bound to service");
binder = new LocationServiceBinder(this);
return binder;
}
// Handle location updates from the location manager
public void StartLocationUpdates()
{
//we can set different location criteria based on requirements for our app -
//for example, we might want to preserve power, or get extreme accuracy
var locationCriteria = new Criteria();
locationCriteria.Accuracy = Accuracy.NoRequirement;
locationCriteria.PowerRequirement = Power.NoRequirement;
// get provider: GPS, Network, etc.
var locationProvider = LocMgr.GetBestProvider(locationCriteria, true);
Log.Debug(logTag, string.Format("You are about to get location updates via {0}", locationProvider));
// Get an initial fix on location
LocMgr.RequestLocationUpdates(locationProvider, 2000, 0, this);
Log.Debug(logTag, "Now sending location updates");
}
public override void OnDestroy()
{
base.OnDestroy();
Log.Debug(logTag, "Service has been terminated");
// Stop getting updates from the location manager:
LocMgr.RemoveUpdates(this);
}
}
}
这是我的演示,您可以参考。