2017-01-23 9 views
0

MapBoxを使用したGPS使用に関する問題が発生しています。私はそれをオンにした直後に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:問題を発見しましたが、解決策を見つけることができませんでした。問題は「lastLocation」である「enableLocation」から変数である:

Location lastLocation = locationServices.getLastLocation(); 

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

変数は、私はそれがまだポジションを持っていなかったという事実にGPSをオンにし、ことを正確にした後、NULLであります関数 '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マップのロケーションマネージャーを使うべきですか? Mapboxでこれを行う方法はありますか? –

+0

LocationManagerはAndroidに組み込まれています。 Googleマップを使用する必要はありません。 –

+0

@Gabe_Sechan助けてくれてありがとう!私はrequestLocationUpdatesに使用する必要があるパラメータの1つで、AndroidのLocation Managerを使用するのに少し問題がありますが、GPSを使用するにはマップボックスのLocationManagerが必要ですが、アンドロイドを使用するたびに、お互い。 mapboxとrequestLocationUpdatesに使用できる例がありますか? –

関連する問題