2013-04-03 3 views
0

Я немного потерялся здесь. В принципе, мне нужно получить общее местоположение пользователя самым быстрым, легким, возможным способом. Это код, у меня естьAndroid - менеджер местоположений - странный сбойный вопрос

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);     
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
criteria.setAltitudeRequired(false); 
criteria.setBearingRequired(false); 
criteria.setCostAllowed(false); 
criteria.setPowerRequirement(Criteria.POWER_LOW); 

provider = locationManager.getBestProvider(criteria, true); 
Location location = locationManager.getLastKnownLocation(provider); 
Log.d(TAG,"Lat - " + (location.getLatitude()) + " long - " + (location.getLongitude())); 

Вчера он работал pefectly для меня, но сегодня я получаю ошибку Null Pointer когда Log.d пытается получить доступ к location. Я отправил приложение двум друзьям, и он отлично справился с их телефонами. Есть ли что-то, что я могу изменить, чтобы сделать код более надежным? Что могло вызвать аварии на моем телефоне?

Edit - Я получил замок GPS в Картах и ​​вернулся в мое приложение, но он по-прежнему падает ..

+1

Null проверяет вокруг заявления журнала. –

+0

Возможно, у вас есть addlistener? –

ответ

1
Location location = locationManager.getLastKnownLocation(provider); 

Это не всегда возвращает местоположение. Infact много раз он дает NULL.

Вы должны обязательно проверить наличие: NULL.

if(location != null){ 
     Log.d(TAG,"Lat - " + (location.getLatitude()) + " long - " + (location.getLongitude())); 
} 

Причина нулевого местоположения может быть, то provider'sLastKnownLocation истекло (старая отметка времени).

+0

Я убедился, что у меня есть блокировка gps на картах, а затем вернусь, но приложение все еще падает. Как я могу заставить новое обновление местоположения? thank – Shmuel

+0

Поскольку вы задали вопрос 'criteria.setAccuracy (Criteria.ACCURACY_COARSE),' лучшим провайдером будет ** NETWORK_PROVIDER **. Итак, я думаю, что замок ** GPS ** не имеет значения. –

+0

Я просто экспериментировал с разными уровнями точности. он по-прежнему падает – Shmuel

1

Если вы проверить ссылку здесь https://developer.android.com/reference/android/location/LocationManager.html#getLastKnownLocation(java.lang.String); вы увидите, что getLastKnownLocation:

Возвращает последнее известное место для провайдера или нулевой

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

1

Ваши критерии, скорее всего, приводят к местоположению сети, когда Wi-Fi недоступен, используется ячеистая башня и, следовательно, может потребоваться стоимость, если ваши данные превышают лимит. Таким образом, для Сети это правда. Таким образом, если вы измените

criteria.setCostAllowed(true); 

все будет в порядке.

+0

уже пробовал это. все еще не работает – Shmuel

+1

Вместо критериев просто используйте locationManager.getLastKnownLocation (LocationManager.NETWORK_PROVIDER) и посмотрите, не сработает ли он. Если это так, то нет последнего известного местоположения сети. –

+0

Что вы подразумеваете под GPS-блокировкой? вы имеете в виду исправить? –

0

Ваше местоположение является пустым, так что вы можете получить ошибку

if(location != null){ 
     Log.d(TAG,"Lat - " + (location.getLatitude()) + " long - " + (location.getLongitude())); 
} 

Location Demo