Ошибка вызывает виртуальный метод ‘double android.location.Location.getLatitude ()’ в ссылке на нулевой объект

Все, что я пытаюсь сделать, это позволить пользователю получить список мест, которые ему нравятся. Например, если вход был в больнице, мое приложение откроет карты Google со строкой поиска «Больница». Но, как было предложено в документации с использованием геокода типа geo:0,0?q=hospital uri показывает все больницы около координат 0 широты и 0 долготы. Поэтому, когда я попытался сначала получить координаты пользователей, используя следующий код.

Места Decoder.java

 package com.kkze.Mappy; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; public class PlacesDecoder extends Activity { Intent intentThatCalled; public double latitude; public double longitude; public LocationManager locationManager; public Criteria criteria; public String bestProvider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); intentThatCalled = getIntent(); String voice2text = intentThatCalled.getStringExtra("v2txt"); getLocation(voice2text); } public static boolean isLocationEnabled(Context context) { int locationMode = 0; String locationProviders; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { try { locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE); } catch (Settings.SettingNotFoundException e) { e.printStackTrace(); } return locationMode != Settings.Secure.LOCATION_MODE_OFF; } else { locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); return !TextUtils.isEmpty(locationProviders); } } public void getLocation(String voice2txt) { locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); criteria = new Criteria(); bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString(); Location location = locationManager.getLastKnownLocation(bestProvider); if (isLocationEnabled(PlacesDecoder.this)) { Log.e("TAG", "GPS is on"); latitude = location.getLatitude(); longitude = location.getLongitude(); Toast.makeText(PlacesDecoder.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show(); searchNearestPlace(voice2txt); } else { AlertDialog.Builder notifyLocationServices = new AlertDialog.Builder(PlacesDecoder.this); notifyLocationServices.setTitle("Switch on Location Services"); notifyLocationServices.setMessage("Location Services must be turned on to complete this action. Also please take note that if on a very weak network connection, such as 'E' Mobile Data or 'Very weak Wifi-Connections' it may take even 15 mins to load. If on a very weak network connection as stated above, location returned to application may be null or nothing and cause the application to crash."); notifyLocationServices.setPositiveButton("Ok, Open Settings", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent openLocationSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); PlacesDecoder.this.startActivity(openLocationSettings); finish(); } }); notifyLocationServices.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); notifyLocationServices.show(); } } public void searchNearestPlace(String v2txt) { Log.e("TAG", "Started"); v2txt = v2txt.toLowerCase(); String[] placesS = {"accounting", "airport", "aquarium", "atm", "attraction", "bakery", "bakeries", "bank", "bar", "cafe", "campground", "casino", "cemetery", "cemeteries", "church", "courthouse", "dentist", "doctor", "electrician", "embassy", "embassies", "establishment", "finance", "florist", "food", "grocery", "groceries", "supermarket", "gym", "health", "hospital", "laundry", "laundries", "lawyer", "library", "libraries", "locksmith", "lodging", "mosque", "museum", "painter", "park", "parking", "pharmacy", "pharmacies", "physiotherapist", "plumber", "police", "restaurant", "school", "spa", "stadium", "storage", "store", "synagog", "synagogue", "university", "universities", "zoo"}; String[] placesM = {"amusement park", "animal care", "animal care", "animal hospital", "art gallery", "art galleries", "beauty salon", "bicycle store", "book store", "bowling alley", "bus station", "car dealer", "car rental", "car repair", "car wash", "city hall", "clothing store", "convenience store", "department store", "electronics store", "electronic store", "fire station", "funeral home", "furniture store", "gas station", "general contractor", "hair care", "hardware store", "hindu temple", "home good store", "homes good store", "home goods store", "homes goods store", "insurance agency", "insurance agencies", "jewelry store", "liquor store", "local government office", "meal delivery", "meal deliveries", "meal takeaway", "movie rental", "movie theater", "moving company", "moving companies", "night club", "pet store", "place of worship", "places of worship", "post office", "real estate agency", "real estate agencies", "roofing contractor", "rv park", "shoe store", "shopping mall", "subway station", "taxi stand", "train station", "travel agency", "travel agencies", "veterinary care"}; int index; for (int i = 0; i <= placesM.length - 1; i++) { Log.e("TAG", "forM"); if (v2txt.contains(placesM[i])) { Log.e("TAG", "sensedM?!"); index = i; Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesM[index]); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); finish(); } } for (int i = 0; i <= placesS.length - 1; i++) { Log.e("TAG", "forS"); if (v2txt.contains(placesS[i])) { Log.e("TAG", "sensedS?!"); index = i; Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesS[index]); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); finish(); } } } } 

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

Что я наделал:

  1. Провел день и ночь, пытаясь решить эту проблему.
  2. Просмотрен через многочисленные страницы по теме.
  3. Пробовал разные мои собственные коды.

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

Это мой LogCat.

 Process: com.kkze.Mappy, PID: 6742 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kkze.Mappy/com.kkze.Mappy.PlacesDecoder}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) at android.app.ActivityThread.access$900(ActivityThread.java:172) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5832) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference at com.kkze.Mappy.PlacesDecoder.getLocation(PlacesDecoder.java:62) at com.kkze.Mappy.PlacesDecoder.onCreate(PlacesDecoder.java:32) at android.app.Activity.performCreate(Activity.java:6221) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) at android.app.ActivityThread.access$900(ActivityThread.java:172) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5832) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Кроме того, проверка местоположения! = Null требует разрешения ACCESS_FINE_LOCATION, которое помешает моему приложению, заставляя его всегда возвращать как null.

3 Solutions collect form web for “Ошибка вызывает виртуальный метод ‘double android.location.Location.getLatitude ()’ в ссылке на нулевой объект”

Как упоминал Джон Скит в комментариях, метод getLastKnownLocation() может и будет возвращать значение null. Основная проблема заключается в том, что он не запрашивает ОС для новой блокировки местоположения, вместо этого он просто проверяет, было ли последнее известное местоположение из запроса местоположения другого приложения. Если ни одно другое приложение не сделало запрос местоположения недавно, вы получите нулевое местоположение, возвращенное вам.

Единственный способ гарантировать, что вы действительно получаете местоположение, – это запросить его, и это делается с помощью вызова requestLocationUpdates() .

Место, переданное в метод обратного вызова onLocationChanged() , не будет равно нулю, поскольку обратный вызов происходит только при успешной блокировке местоположения.

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

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

Вот общая структура вашего кода:

 public class MainActivity extends Activity implements LocationListener { Intent intentThatCalled; public double latitude; public double longitude; public LocationManager locationManager; public Criteria criteria; public String bestProvider; String voice2text; //added @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentThatCalled = getIntent(); voice2text = intentThatCalled.getStringExtra("v2txt"); getLocation(); } public static boolean isLocationEnabled(Context context) { //............... return true; } protected void getLocation() { if (isLocationEnabled(MainActivity.this)) { locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); criteria = new Criteria(); bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString(); //You can still do this if you like, you might get lucky: Location location = locationManager.getLastKnownLocation(bestProvider); if (location != null) { Log.e("TAG", "GPS is on"); latitude = location.getLatitude(); longitude = location.getLongitude(); Toast.makeText(MainActivity.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show(); searchNearestPlace(voice2text); } else{ //This is what you need: locationManager.requestLocationUpdates(bestProvider, 1000, 0, this); } } else { //prompt user to enable location.... //................. } } @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { //Hey, a non null location! Sweet! //remove location callback: locationManager.removeUpdates(this); //open the map: latitude = location.getLatitude(); longitude = location.getLongitude(); Toast.makeText(MainActivity.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show(); searchNearestPlace(voice2text); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } public void searchNearestPlace(String v2txt) { //..... } } 

Измените это в методе getLocation

 if (isLocationEnabled(PlacesDecoder.this) && location != null) { ... } 

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

  • TCP \ IP-клиент - EHOSTUNREACH (нет пути к хосту)
  • Ошибка AndroidRuntime: Посылка: не удалось вывести значение маршала
  • Вычисление расстояния между двумя точками
  • Рассчитать количество будних дней между двумя датами в Java
  • Подстрочный индекс и надстрочный указатель строки в Android
  • Показывать только две цифры после десятичной
  • Записывать телефонные звонки на Android-телефоне?
  • Как установить изображение экрана блокировки Android
  • Как начать работу в адаптере?
  • Проложить маршруты с помощью API Карт Google v2
  • Что означает восклицательный знак на Java?
  • Interesting Posts

    Не нужно бросать результат findViewById?

    JQGrid Программно выберите Grid Row

    Передача параметров на действие кнопки: @selector

    Запрос Firebase, если дочерний элемент дочернего элемента содержит значение

    Ресурсы обучения для парсеров, переводчиков и компиляторов

    Почему я получаю «General Failure» при проверке имени хоста на узле Win 7 в сети?

    Как войти в настройку BIOS на HP P6210T

    Возможно ли использовать функцию re.table.f.foverlaps, чтобы найти пересечение перекрывающихся диапазонов в двух таблицах?

    ВСТАВИТЬ, ЕСЛИ НЕ СУЩЕСТВУЕТ ОБЩЕЕ ОБНОВЛЕНИЕ?

    различия между использованием wmode = “transparent”, “opaque” или “window” для встроенного объекта на веб-странице

    Android – аккордеонный виджет

    Динамические имена переменных в Bash

    html5 Websocket с SSL

    Исправлена ​​ошибка инициализации ffmpeg drawtext

    Скажите gcc, чтобы специально развернуть цикл

    Давайте будем гением компьютера.