LocationListener работает на эмуляторе, а не на телефоне - PullRequest
4 голосов
/ 04 февраля 2011

У меня проблемы с получением LocationListener для вызова функции обратного вызова onLocationChanged () на моем телефоне. Когда я запускаю свой код в эмуляторе, он работает нормально, обратный вызов вызывается каждый раз, когда я делаю гео-исправление.

Когда я запускаю приложение на своем телефоне, ничего не происходит. Обратный звонок никогда не вызывается. У меня есть местоположение, включенное как по GPS, так и по беспроводной связи в моих настройках. Приложение имеет все разрешения на использование для разрешений местоположения.

Кроме того, когда я вызываю getLastKnownLocation () для объекта LocationManager, происходит сбой моего приложения. (Все же только на моем дурацком телефоне). Даже если я пытаюсь поймать исключение, которое вызывает его сбой, оно все равно просто дает сбой, поэтому я даже не могу получить никакой информации о том, что вызывает его сбой. Это очень расстраивает.

LocationManager.getBestProvider () возвращает GPS, и когда я открываю карты Google, он мгновенно находит мое местоположение. Какого черта здесь происходит? Есть ли какой-нибудь способ выяснить, почему он зависает на моем телефоне?

    private void setupLocListener(){    
    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_FINE);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(false);
    lm.requestLocationUpdates(lm.getBestProvider(c,true), 0, 0, new LocationListener() {
        @Override
        public void onLocationChanged(Location arg0) {
            map.setLocation(arg0);
        }
        public void onProviderDisabled(String arg0) {   
        }
        public void onProviderEnabled(String arg0) {    
        }
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {   }
    });
}

Ответы [ 2 ]

1 голос
/ 17 июня 2011

onLocationChanged () не будет срабатывать, пока вы фактически не начнете получать GPS-координаты.

Под этим я подразумеваю, что чип должен прогреться примерно минуту или около того, исходя из моего опыта, прежде чем вы начнете получать от него данные.

Обычно я запускаю какое-то другое приложение и жду, пока он докажет, что GPS-чип прогрелся, прежде чем я начну тестировать любое из моих приложений GPS.

Я знаю, что вы упомянули, что он правильно работает в Картах Google, но пытались ли вы очистить свою память и сразу же перезапустить приложение?

Также getLastKnownLocation () всегда будет нулевым, пока вы не начнете получать координаты.

0 голосов
/ 12 октября 2011

Каркас местоположения передает координаты вашему обратному вызову, когда они становятся доступными.В зависимости от погоды и т. Д. Вы можете сначала не получить «починку».Вы должны увидеть индикатор «GPS» в строке состояния, когда ваш слушатель будет успешно зарегистрирован.getLastKnownPosition() работает просто отлично (может вернуть null);и Google Maps использует это, пока ожидает первоначального исправления от поставщика местоположения.Вы также можете посмотреть, какие другие поставщики доступны, например, данные сотовой вышки, и попытаться получить данные от них (например, LKP), либо вместо, либо до тех пор, пока ваш «предпочтительный» поставщик не начнет выдавать данные.Кроме того, не думайте, что какая-то конкретная услуга существует, например, LocationManager (Context.getSystemService() может вернуть null) или существует любой подходящий поставщик (getBestProvider() может вернуть null).Ваш код не будет работать как есть на правильном устройстве с правильными настройками.Если в документации написано null, вы должны проверить это, или пользователи будут удалять его, потому что он повсюду.

...