Приложение Codename One не указывает реальное местоположение

В нашем приложении есть модуль, с помощью которого вы можете отправлять записи времени с указанием местоположения по GPS.

В 40% случаев у нас есть проблема с местоположением, потому что модуль предоставляет местоположение, которое не является реальным (иногда на расстоянии около 1 км).

Когда у нас есть эти кейсы, мы открываем приложение Google Maps, и оно дает нам идеальное местоположение, затем снова приложение и не реальное местоположение.

Для получения местоположения мы используем это:

Slider s1 = new Slider();
Dialog dlg = makeDialog("HIGH PRECISION LOCATION...", s1, null, 'a');
dlg.addShowListener((ActionListener) e -> {

    LocationManager locationManager = LocationManager.getLocationManager();                
    locationManager.setLocationListener(this, new LocationRequest(LocationRequest.PRIORITY_HIGH_ACCUARCY, 500));

    loc = locationManager.getCurrentLocationSync(20000);

    dlg.dispose();
    if(loc == null) {
        Slider s2 = new Slider();
        Dialog dlg2 = makeDialog("GETTING LAST KNOWN LOCATION...", s2, "OK", 'a');
        dlg2.addShowListener((ActionListener) e2 -> {
            loc = locationManager.getLastKnownLocation();

            if(loc == null) {
                // location not found
                Dialog.show("Attenzione!", "Posizione non trovata. E' consigliato di spostarsi all'aperto. "
                        + "Tuttavia è possibile inviare la timbratura anche senza coordinate.", "Ok", null);
            } else {
                paintLocation(loc, GPSStateOn);
            }
        });
        dlg2.show();
    } else {
        paintLocation(loc, GPSStateOn);
    }

});
dlg.show();

-

@Override
public void locationUpdated(final Location location) {

    switch (LocationManager.getLocationManager().getStatus()) {
        case LocationManager.AVAILABLE:
            GPSStateOn = true;
            break;
        case LocationManager.OUT_OF_SERVICE:
            GPSStateOn = false;
            break;                
        case LocationManager.TEMPORARILY_UNAVAILABLE:
            GPSStateOn = false;                 
            break;                
    }

    if(loc != null) {
        paintLocation(loc,GPSStateOn);
        System.out.println("-----LATITUDINE: " + loc.getLatitude());
        System.out.println("-----LONGITUDINE: " + loc.getLongitude());
    }
}

Мы также добавили подсказку по сборке android.playService.location = true


ДОБАВЛЕНО 25/04/2020 11:58 Я забыл сказать, что примерно в 40% случаев он приходит на "УЗНАТЬ ПОСЛЕДНЕЕ ИЗВЕСТНОЕ МЕСТОПОЛОЖЕНИЕ ...", а затем дает идеальное реальное местоположение. Советы по сборке Android:  введите описание изображения здесь


последний обрезан ... значение:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/><uses-feature         android:glEsVersion="0x00020000"         android:required="true"/><uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera" android:required="false"/>


ДОБАВЛЕНО 06.05.2020 10:48

Может быть, это может быть полезно: я заметил, что когда местоположение занимает много места, значок GPS не отображается на верхней панели  введите описание изображения здесь

А когда это займет меньше времени, значок GPS станет видимым  введите описание изображения здесь


person loreeemartiii    schedule 24.04.2020    source источник
comment
Это похоже на проблему с отсутствующим android.playService.location. Пожалуйста, проверьте правильность написания в codenameone_settings.properties. Если да, перечислите все имеющиеся у вас советы по сборке android. *.   -  person Shai Almog    schedule 25.04.2020
comment
@ShaiAlmog Я отредактировал исходный вопрос, добавив подсказки по сборке Android (см. ДОБАВЛЕННАЯ часть 25/04/2020 11:58)   -  person loreeemartiii    schedule 25.04.2020
comment
Вы смотрели codenameone_settings.properties? Там легче увидеть неправильно написанную запись.   -  person Shai Almog    schedule 26.04.2020
comment
Я не знаю, что мне искать. Мой codenameone_settings.properties: pastebin.com/raw/xQ04qgVQ   -  person loreeemartiii    schedule 26.04.2020


Ответы (1)


Еще раз посмотрев на код, я заметил, что вы использовали set location listener и getCurrentLocationSync, которые в данном случае являются взаимоисключающими. Вам нужно выбрать один. Если вы дадите первому (что является предпочтительным способом) достаточно времени для работы, он даст вам точное местоположение. Обратите внимание, что для начального считывания иногда требуется пара секунд.

person Shai Almog    schedule 27.04.2020
comment
Я пробовал настроить слушателя ... Иногда это занимает более 30 секунд, когда я все еще загружаю, я закрываю приложение, затем запускаю его снова и вуаля: идеальное положение за 2 секунды - person loreeemartiii; 05.05.2020
comment
Но я не могу сказать клиентам, чтобы они перезапускали приложение, Google Карты всегда занимают не более 2 секунд. - person loreeemartiii; 05.05.2020
comment
Это происходит только на вашем устройстве или других устройствах? Вы уверены, что обратный вызов слушателя никогда не вызывался? - person Shai Almog; 06.05.2020
comment
Да, потому что в обратном вызове я размещаю диалог загрузки ... И он никогда не удаляется - person loreeemartiii; 06.05.2020
comment
Или обратный вызов вызывается так быстро, что диалог еще не успел полностью отобразиться - person Shai Almog; 06.05.2020
comment
Я отредактировал исходный вопрос, добавив два снимка экрана, которые, возможно, будут вам полезны - см. ДОБАВЛЕНО 06/05/2020 10:48 - person loreeemartiii; 06.05.2020
comment
Я думаю, что это с точностью до наоборот. Я думаю, вы получаете обратный вызов так быстро, что диалоговое окно еще не отображается, поэтому вы не можете его удалить. Вы как следует защитились от этого случая? - person Shai Almog; 07.05.2020