Xamarin. Android не получает обновлений местоположения в режиме прямой загрузки - PullRequest
0 голосов
/ 11 июля 2019

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 просто умирал ...

Любые советы / предложения / или подтверждение того, что то, что я пытаюсь сделать, невозможно, будет с благодарностью!

Спасибо!

...