2017-01-23 2 views
0

У меня возникла проблема, связанная с использованием GPS с помощью MapBox. Всякий раз, когда я пытаюсь использовать методы, чтобы использовать право GPS после того, как я включил его, я получаю эту ошибку (я пытался использовать getLatitude на этот раз):Нулевая ссылка при использовании Mapbox getLatitude или getLongitude

java.lang.NullPointerException: Attempt to invoke virtual method 
'double com.mapbox.services.commons.models.Position.getLatitude()' on a null object reference 

Я считаю, что GPS не найти позицию еще, и именно поэтому я получаю нулевую ссылку, потому что она работает, и показывает мне правильную позицию, если я подожду немного до получения доступа к функции, использующей методы GPS. Я нашел здесь что-то, связанное с этой ошибкой, но это использует Google Maps.

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

Вот код, я получаю сообщение об ошибке:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //... 

    mapView = (MapView) findViewById(R.id.mapView); 
    mapView.onCreate(savedInstanceState); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(final MapboxMap mapboxMap) { 
      map = mapboxMap; 

      //... 

      // Button that shows the user their location 
      floatingActionButton = (ImageButton) findViewById(R.id.location_toggle_fab); 
      floatingActionButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        //Verifica se o usuario esta com o GPS ligado 
        final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
         if (map != null) { 
          toggleGps(!map.isMyLocationEnabled()); 
         } 
        }else{ 
         //function that warns the user that they don't have their GPS turned on 
         montaAlertaSemGps(); 
        } 
       } 
      }); 

      //InfoWindow Data 
      mapboxMap.setInfoWindowAdapter(new MapboxMap.InfoWindowAdapter() { 
       @Nullable 
       @Override 
       public View getInfoWindow(@NonNull Marker marker) { 

        //... 

        final Marker marcador = marker; 

        if (!marker.getTitle().equals("Origem")&&!marker.getTitle().equals("Destino")) { 

         botaoIr = (Button) v.findViewById(R.id.botaoIr); 
         botaoIr.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 

           final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
           //Checks if the user have their GPS turned on 
           if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 

            origin = Position.fromCoordinates(locationServices.getLastLocation().getLongitude(),locationServices.getLastLocation().getLatitude()); 

            LatLng ponto = marcador.getPosition(); 
            destination = Position.fromCoordinates(ponto.getLongitude(), ponto.getLatitude()); 


//Error starts below 

            origem = new MarkerOptions() 
              .position(new LatLng(origin.getLatitude(), origin.getLongitude())) 
              .title("Origem") 
              .icon(iconeRota); 

            destino = new MarkerOptions() 
              .position(new LatLng(destination.getLatitude(), destination.getLongitude())) 
              .title("Destino") 
              .icon(iconeRota); 

            //... 
            } 
           } else { 
            //... 
           } 
          } 
         }); 
        } 

        return v; 
       } 
      }); 
     } 
    }); 

} 

private void toggleGps(boolean enableGps) { 
     if (enableGps) { 
      // Checa se o usuario permitiu acesso a localizacao 
      if (!locationServices.areLocationPermissionsGranted()) { 
       ActivityCompat.requestPermissions(this, new String[]{ 
         Manifest.permission.ACCESS_COARSE_LOCATION, 
         Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_LOCATION); 
      } else { 
       enableLocation(true); 
      } 
     } else { 
      enableLocation(false); 
     } 
    } 

private void enableLocation(boolean enabled) { 
    if (enabled) { 

     Location lastLocation = locationServices.getLastLocation(); 

     if (lastLocation != null) { 
      map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lastLocation), 16)); 
      origin = Position.fromCoordinates(locationServices.getLastLocation().getLongitude(),locationServices.getLastLocation().getLatitude()); 
     } 

     locationServices.addLocationListener(new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       if (location != null) { 
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location), 16)); 
        locationServices.removeLocationListener(this); 
       } 
      } 
     }); 
     floatingActionButton.setImageResource(R.drawable.ic_location_disabled_black_24dp); 
    } else { 
     floatingActionButton.setImageResource(R.drawable.ic_my_location_24dp); 
    } 

    map.setMyLocationEnabled(enabled); 
} 

Я не могу найти метод, в библиотеках, которые могли бы сделать такую ​​вещь для меня.

EDIT: Я нашел проблему, но мне не удалось найти решение. Проблема заключается в переменной из «enableLocation», которая «lastLocation»:

Location lastLocation = locationServices.getLastLocation(); 

     if (lastLocation != null) { 
      //... 
     } 

Переменная NULL именно после того, как я включил GPS из-за того, что она не принесла позицию еще, и что поэтому функция getLatitude пытается вызвать метод для объекта NULL. Я отлаживал код, используя «else», если это условие выше, но я не уверен, что именно я должен использовать внутри условия «else» или до атрибуции lastLocation.

+0

Какой вызов вызывает исключение, 'origin.getLatitude()' или 'destination.getLatitude()'. Как создается «происхождение»? Похоже, это либо «null», и поэтому ваш метод звонит. – zugaldia

+0

@zugaldia Ops, я удалил значение «origin» после того, как попытался сохранить сообщение в чистом виде здесь. «Origin» - это глобальная переменная (поэтому я могу использовать ее в других функциях), и это значение: «origin = Position.fromCoordinates (locationServices.getLastLocation(). GetLongitude(), locationServices.getLastLocation(). GetLatitude()) ; '. Я отредактировал сообщение и вставил его. Спасибо. Но так или иначе, это getLongitude, которая вызывает фатальную ошибку. –

ответ

0

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

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

0

Способ узнать, есть ли у вас местоположение, чтобы вызвать LocationManager.requestLocationUpdates. Он будет вызывать ваш обратный вызов, когда будет существовать местоположение. Когда это произойдет, вы знаете, что местоположение хорошее.

+0

Хм, значит, я должен использовать диспетчер местоположений Google Maps? Есть ли способ сделать это с помощью Mapbox? –

+0

LocationManager встроен в Android. Вам не нужно использовать Карты Google. –

+0

@Gabe_Sechan Спасибо за помощь! У меня проблемы с использованием диспетчера местоположений Android, потому что это один из параметров, которые мне нужно использовать для requestLocationUpdates, но мне нужно, чтобы MapManager LocationManager использовал GPS, но всякий раз, когда я использую андроид, оба конфликтуют с друг друга. У вас есть примеры, которые я мог бы использовать для mapbox и requestLocationUpdates? –