Xamarin / Android: расположение работает в эмуляции, но не на физическом устройстве - PullRequest
0 голосов
/ 30 января 2019

Я использую Xamarin для создания приложения для Android, которое перечисляет несколько магазинов и сообщает вам, насколько они далеко.У меня уже работает в эмуляторе Android.Но когда я отлаживаю на своем физическом устройстве (Samsung Galaxy S5 / LineageOS 15.1 / Android 8.1.0), я не получаю обновления местоположения.Другие приложения, использующие данные о местоположении, работают нормально, например, Карты Google.

Приложение запрашивает разрешение, и я убедился, что действительно вызывается следующая функция, StartRequestingLocationData().

Однако OnLocationChanged(Location location) никогда не вызывается при запуске приложения на физическом устройстве.В эмуляторе все работает отлично, и он дает местоположение как сразу при запуске, так и продолжает обновлять его по мере поступления новых данных о местоположении.

Я хотел бы предоставить сообщение об ошибке или быть более тщательным, но яне вижу никаких подсказок относительно того, что может быть причиной этого.Например, я не вижу ошибок или предупреждений в выходных данных.

Это мое первое приложение для Android (хотя я приправлен на многих других платформах), поэтому я вполне могу упустить что-то очевидное для других.Моя проблема в том, что я не могу понять, где искать подсказки, а поиск в Интернете не позволил охватить эту проблему.

Вот соответствующий код.Заранее спасибо.

    public void StartRequestingLocationData()
    {
        this.location_manager = (LocationManager)GetSystemService(Context.LocationService);

        Criteria crit = new Criteria();
        crit.Accuracy = Accuracy.Fine;
        crit.AltitudeRequired = false;
        crit.BearingRequired = false;
        crit.SpeedRequired = false;

        // Both the emulator and physical device report this as "gps".
        string provider = this.location_manager.GetBestProvider(crit, true);

        this.location_manager.RequestLocationUpdates(provider, 1, 1, this);

        Location last_location = this.location_manager.GetLastKnownLocation(provider);
        if (last_location != null)
        {
            this.OnLocationChanged(last_location);
        }
    }

    public void OnLocationChanged(Location location)
    {
        foreach (Replenisher store in this.stores)
        {
            if (store.DistanceView != null)
            {
                LatLng store_loc = new LatLng(double.Parse(store.GPSN), double.Parse(store.GPSW));
                LatLng our_loc = new LatLng(location.Latitude, location.Longitude);
                double distance = Meters.ComputeDistanceBetween(our_loc, store_loc);

                store.DistanceView.Text = GetString(
                    Resource.String.kilometers_away,
                    distance / 1000
                );
                store.DistanceView.Visibility = ViewStates.Visible;
            }
        }
    }
...