TLDR: возможно ли получить доступ к местоположению в режиме прямой загрузки?
Я хочу получать обновления местоположения для устройства (тестирование на пикселе 3a) при загрузке телефона.Это вспомогательная функция для обычного приложения, поэтому примите во внимание необходимые разрешения и т. Д.
Следующий код также взят из компонентов, которые работают нормально при вызове из MainActivity.
Шаги для настройки обратных вызовов местоположения:
Во-первых, DirectBootAware BroadcastReceiver, который прослушивает ACTION_LOCKED_BOOT_COMPLETED, означает, что я могу запускать код при загрузке устройства и до разблокировки экрана.
[BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true)]
[IntentFilter(new string[] { Intent.ActionLockedBootCompleted })]
public class StartForegroundServiceReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Отсюда я могу убедиться, что разрешения для определения местоположения Corse и Fine предоставлены (какие они есть!)
var permissionCheckResult = context.CheckSelfPermission(Manifest.Permission.AccessFineLocation);
Android.Util.Log.Info("TestingTag", $"AccessFineLocation CheckSelfPermission {permissionCheckResult.ToString()}");
permissionCheckResult = context.CheckSelfPermission(Manifest.Permission.LocationHardware);
Android.Util.Log.Info("TestingTag", $"LocationHardware CheckSelfPermission {permissionCheckResult.ToString()}");
permissionCheckResult = context.CheckSelfPermission(Manifest.Permission.AccessCoarseLocation);
Android.Util.Log.Info("TestingTag", $"AccessCoarseLocation CheckSelfPermission {permissionCheckResult.ToString()}");
и что провайдеры сети, GPS и пассивного определения местоположения включены (опять же, они 'все включено!)
var locationManager = (LocationManager)context.GetSystemService(Context.LocationService);
var enabled = locationManager.IsProviderEnabled(LocationManager.PassiveProvider);
Log.Info("TestingTag", $"PassiveProvider IsProviderEnabled {(enabled ? "yes" : "no")}");
enabled = locationManager.IsProviderEnabled(LocationManager.GpsProvider);
Log.Info("TestingTag", $"GpsProvider IsProviderEnabled {(enabled ? "yes" : "no")}");
enabled = locationManager.IsProviderEnabled(LocationManager.NetworkProvider);
Log.Info("TestingTag", $"NetworkProvider IsProviderEnabled {(enabled ? "yes" : "no")}");
Если я проверю GetLastKnownLocation
var location = locationManager.GetLastKnownLocation(LocationManager.GpsProvider);
if (location == null)
{
location = locationManager.GetLastKnownLocation(LocationManager.NetworkProvider);
}
if (location == null)
{
location = locationManager.GetLastKnownLocation(LocationManager.PassiveProvider);
}
if (location == null)
Log.Error("TestingTag", $"Location is null");
Это всегда возвращает ноль, возможно, потому что устройство только что загрузилось?Или, может быть, это из-за той же основной причины, что и отсутствие получения обновлений местоположения?
Наконец, я регистрируюсь для обновлений местоположения с LocationManager
var callback = new LocationCallback();
Log.Info("TestingTag", "Starting RequestLocationUpdates via PassiveProvider..");
locationManager.RequestLocationUpdates(LocationManager.PassiveProvider, 3000, 3, callback);
Log.Info("TestingTag", "Starting RequestLocationUpdates via GpsProvider..");
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 3000, 3, callback);
Log.Info("TestingTag", "Starting RequestLocationUpdates via NetworkProvider..");
locationManager.RequestLocationUpdates(LocationManager.NetworkProvider, 3000, 3, callback);
Вот код обратного вызова местоположения:
public class LocationCallback : ScanCallback, Android.Locations.ILocationListener
{
public void OnLocationChanged(Location location)
{
Log.Info("TestingTag", $"OnLocationChanged {location.Latitude} ~ {location.Longitude}");
}
public void OnProviderDisabled(string provider)
{
Log.Info("TestingTag", $"OnProviderDisabled {provider}");
}
public void OnProviderEnabled(string provider)
{
Log.Info("TestingTag", $"OnProviderEnabled {provider}");
}
public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
{
Log.Info("TestingTag", $"OnStatusChanged {provider} ~ {status.ToString()}");
}
}
Обратный вызов никогда не вызывается: - (
Я добавил BluetoothManager
для сканирования сигналов BLE (для этого пропущен код), и это работает, ScanResults возвращаются нормально ителефон / BroadcastReceiver все еще жив, так что это не так, как если бы BroadcastReceiver просто умирал ...
Любые советы / предложения / или подтверждение того, что то, что я пытаюсь сделать, невозможно, будет с благодарностью!
Спасибо!