using System;
using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Locations;
using Android.OS;
using Android.Runtime;
using Android.Widget;
namespace Shared
{
///
/// GPS 后台定位
///
[Service]
public class GPSLocationService:Service
{
public override IBinder OnBind(Intent intent)
{
return null;
}
public override void OnCreate()
{
base.OnCreate();
if (BaseActivity.IsEnnableGPS)
{
(Shared.Application.Activity as BaseActivity).SetGPSLocationPermission(result =>
{
if (result)
{
initLocation();
notification();
}
});
}
}
[Obsolete]
void notification()
{
if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var mNotificationUtils = new NotificationUtils(this);
var notificationIntent = new Intent(this, typeof(BaseActivity));
var pendingIntent = PendingIntent.GetActivity(this, 3,
notificationIntent, PendingIntentFlags.CancelCurrent);
var builder = mNotificationUtils.getAndroidChannelNotification
(Language.CurrentLanguage == "Chinese"?"获取定位信息":"Get Location Information", "", pendingIntent);
StartForeground(1, builder.Build());//id must not be 0,即禁止是0
}
}
class NotificationUtils :Notification.Builder
{
private NotificationManager mManager;
public static string channelId = "85521566";
public static string channelName = "HDLChanneName";
private Context context;
[Obsolete]
public NotificationUtils(Context context) : base(context)
{
this.context = context;
createChannels();
}
public void createChannels()
{
// create android channel
if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var androidChannel = new NotificationChannel(channelId,
context.PackageName, NotificationImportance.High);
// Sets whether notifications posted to this channel should display notification lights
androidChannel.EnableLights(false);
// Sets whether notification posted to this channel should vibrate.
androidChannel.EnableVibration(false);
androidChannel.SetVibrationPattern(new long[] { 0 });
// Sets the notification light color for notifications posted to this channel
androidChannel.LightColor = 0x38FF1234;
// Sets whether notifications posted to this channel appear on the lockscreen or not
androidChannel.LockscreenVisibility = NotificationVisibility.Private;
getManager().CreateNotificationChannel(androidChannel);
}
}
private NotificationManager getManager()
{
if (mManager == null)
{
mManager = (NotificationManager)context.GetSystemService(NotificationService);
}
return mManager;
}
public Notification.Builder getAndroidChannelNotification(string title, string body, PendingIntent pendingIntent)
{
if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
return new Notification.Builder(context, channelId)
.SetContentTitle(title)
.SetContentText(body)
.SetContentIntent(pendingIntent)
.SetSmallIcon(Android.Graphics.Drawables.Icon.CreateWithBitmap( ((Android.Graphics.Drawables.BitmapDrawable)context.PackageManager.GetApplicationIcon(context.PackageManager.GetApplicationInfo(context.PackageName,0))).Bitmap))//android.R.drawable.stat_notify_more
//.SetWhen(System.DateTime.Now.Ticks)
.SetOngoing(true)
.SetChannelId(channelId)
.SetAutoCancel(true);
}
else
{
return new Notification.Builder(context, channelId);
}
}
}
#region GPS定位
LocationManager locationManager;
///
/// 初始化定位服务
///
void initLocation()
{
//GPS初始化
locationManager = GetSystemService(LocationService).JavaCast();
// 判断GPS是否正常启动
if (!locationManager.IsProviderEnabled(LocationManager.GpsProvider))
{
if (Language.CurrentLanguage == "Chinese")
{
Toast.MakeText(this, "请打开GPS...", ToastLength.Long).Show();
}
else
{
Toast.MakeText(this, "Please open GPS...", ToastLength.Long).Show();
}
}
else
{
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 60 * 1000, 1000, new locationChange { });
}
}
class locationChange : Java.Lang.Object, Android.Locations.ILocationListener
{
public void OnLocationChanged(Location location)
{
Shared.Application.LocationAction?.Invoke(location.Longitude, location.Latitude);
}
public void OnProviderDisabled(string provider)
{
}
public void OnProviderEnabled(string provider)
{
}
public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
{
}
}
public void OnLocationChanged(Location location)
{
}
public void OnProviderDisabled(string provider)
{
}
public void OnProviderEnabled(string provider)
{
}
public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
{
}
#endregion
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
return StartCommandResult.Sticky;
}
}
}