2016-08-25 3 views
-1

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

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
Double longitude = location.getLongitude(); 
Double latitude = location.getLatitude(); 
Log.i("LATITUDE", latitude.toString()); 
Log.i("LONGITUTDE", longitude.toString()); 

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

java.lang.RuntimeException: Не удается запустить активность ComponentInfo {di.uoa.gr.e_commerce/ди .uoa.gr.e_commerce.FirstResultsActivity}:

java.lang.NullPointerException: Попытка вызвать 'двойной android.location.Location.getLongitude()' виртуальный метод на нулевой ссылки на объект на android.app.ActivityThread. performLaunchActivity (ActivityThread.java:2695) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2769) at android.app.ActivityThread.access $ 900 (ActivityThrea d.java:177) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1430) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5910) на java.lang.reflect.Method.invoke (собственный метод) на java.lang.reflect.Method.invoke (метод .java: 372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1405) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)

У меня есть Wi-Fi соединение открыто, а также как мое местоположение. Может ли кто-нибудь выяснить, что может пойти не так?

ответ

2

getLastKnownLocation
[...] Обратите внимание, что это место может быть вне времени, например, если устройство было выключено и перемещен в другое место.

developer.android.com

Вы должны достаточно использовать один из методов requestSingleUpdate или методов requestLocationUpdates, если вам нужно место больше, чем один раз. Here - это документация со всеми сигнатурами для указанных методов.

Это будет выглядеть примерно так:

lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null); 

Вы тогда получили бы место в своем классе. Но вам класс должен будет реализовать LocationListener. В качестве альтернативы вы можете предоставить LocationListener в качестве параметра.

Это будет выглядеть следующим образом:

lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) 
    { 

    } 

    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) 
    { 

    } 

    @Override 
    public void onProviderEnabled(String s) 
    { 

    } 

    @Override 
    public void onProviderDisabled(String s) 
    { 

    } 
    }, null); 

Затем вы получите ваше местоположение раз в onLocationChanged.

+0

Спасибо за ваш ответ. Но до сих пор я не реализовал «LocationListener», но все равно работал отлично. – Marievi

+0

У меня также была такая же проблема, как у вас, но я не знаю объяснения, о котором я уверен. Для возможного объяснения см. Ответ от youzking – Qup

0

Прежде всего, вы должны убедиться, что у вас есть разрешение на получение текущего местоположения, если вы находитесь в Android API 23+, вам нужно попросить его вручную.

Во-вторых, LocationManager.getLastKnownLocation не обязательно возвращает действительное местоположение, так как оно может возвращать «null», то местоположение не достаточно для провайдера, выбранного вами (GPS_PROVIDER). Вы должны отступить к другому провайдеру, если здесь нет места, и попробуйте запросить местоположение, если ничего не найдено.

+0

Спасибо за ваш ответ. – Marievi

0
lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

не обязательно возвращает Расположение, устройство не имеет сохраненную GPS Location, поэтому метод возвращает null;

+0

Спасибо за ваш ответ. – Marievi

+0

ваши приветствуются –