Android Location Services Implemented.
This commit is contained in:
parent
fe26fea450
commit
d61ebd4b75
@ -0,0 +1,134 @@
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using AndroidX.Core.App;
|
||||
using GMCabsDriverAssistant.Messages;
|
||||
using GMCabsDriverAssistant.Services;
|
||||
using GMCabsDriverAssistantSolution.Platforms.Android.Services;
|
||||
using Sentry;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
[assembly: Dependency(typeof(AndroidLocationService))]
|
||||
namespace GMCabsDriverAssistantSolution.Platforms.Android.Services
|
||||
{
|
||||
[Service(Enabled = true)]
|
||||
public class AndroidLocationService : Service, IForegroundService
|
||||
{
|
||||
CancellationTokenSource _cts;
|
||||
public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;
|
||||
public static bool IsForegroundServiceRunning;
|
||||
|
||||
public override IBinder OnBind(Intent intent)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
[return: GeneratedEnum]
|
||||
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
|
||||
{
|
||||
string foregroundChannelId = "GMCabsForeGroundServiceChannel";
|
||||
_cts = new CancellationTokenSource();
|
||||
Task.Run(() =>
|
||||
{
|
||||
while (IsForegroundServiceRunning)
|
||||
{
|
||||
try
|
||||
{
|
||||
var locShared = new LocationService();
|
||||
locShared.Run(_cts.Token).Wait();
|
||||
}
|
||||
catch (System.OperationCanceledException oce)
|
||||
{
|
||||
SentrySdk.CaptureException(oce);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_cts.IsCancellationRequested)
|
||||
{
|
||||
var message = new StopServiceMessage();
|
||||
Device.BeginInvokeOnMainThread(
|
||||
() => DependencyService.Resolve<IForegroundService>().StopMyForegroundService()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, _cts.Token);
|
||||
|
||||
var notifManager = this.GetSystemService(global::Android.Content.Context.NotificationService) as NotificationManager;
|
||||
var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S)
|
||||
? PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Mutable
|
||||
: PendingIntentFlags.UpdateCurrent;
|
||||
var pendingActivityIntent = PendingIntent.GetActivity(this, 0, intent, pendingIntentFlags);
|
||||
var pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, pendingIntentFlags);
|
||||
var notificationBuilder = new NotificationCompat.Builder(this, foregroundChannelId)
|
||||
.SetContentTitle("Location")
|
||||
.SetContentText("Update location")
|
||||
.SetPriority(1)
|
||||
.SetOngoing(true)
|
||||
.SetAutoCancel(true)
|
||||
.SetContentIntent(pendingIntent);
|
||||
|
||||
if (global::Android.OS.Build.VERSION.SdkInt >= global::Android.OS.BuildVersionCodes.O)
|
||||
{
|
||||
var notificationChannel = new NotificationChannel(foregroundChannelId, "Title", NotificationImportance.High);
|
||||
notificationChannel.Importance = NotificationImportance.High;
|
||||
notificationChannel.EnableLights(true);
|
||||
notificationChannel.EnableVibration(true);
|
||||
notificationChannel.SetShowBadge(true);
|
||||
notificationChannel.SetVibrationPattern(new long[] { 100, 200, 300 });
|
||||
if (notificationBuilder != null)
|
||||
{
|
||||
notificationBuilder.SetChannelId(foregroundChannelId);
|
||||
notifManager.CreateNotificationChannel(notificationChannel);
|
||||
}
|
||||
}
|
||||
// Notification notif = DependencyService.Get<INotification>().ReturnNotif();
|
||||
StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notificationBuilder.Build());
|
||||
return base.OnStartCommand(intent, flags, startId);
|
||||
}
|
||||
public override void OnCreate()
|
||||
{
|
||||
base.OnCreate();
|
||||
IsForegroundServiceRunning = true;
|
||||
}
|
||||
public override void OnDestroy()
|
||||
{
|
||||
IsForegroundServiceRunning = false;
|
||||
if (_cts != null)
|
||||
{
|
||||
_cts.Token.ThrowIfCancellationRequested();
|
||||
_cts.Cancel();
|
||||
}
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
public void StartMyForegroundService()
|
||||
{
|
||||
var intent = new Intent(global::Android.App.Application.Context, typeof(AndroidLocationService));
|
||||
if (global::Android.OS.Build.VERSION.SdkInt >= global::Android.OS.BuildVersionCodes.O)
|
||||
{
|
||||
global::Android.App.Application.Context.StartForegroundService(intent);
|
||||
}
|
||||
else
|
||||
{
|
||||
global::Android.App.Application.Context.StartService(intent);
|
||||
}
|
||||
}
|
||||
|
||||
public void StopMyForegroundService()
|
||||
{
|
||||
var intent = new Intent(global::Android.App.Application.Context, typeof(AndroidLocationService));
|
||||
global::Android.App.Application.Context.StopService(intent);
|
||||
}
|
||||
|
||||
public bool IsForeGroundServiceRunning()
|
||||
{
|
||||
return IsForegroundServiceRunning;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user