2017-08-29 2 views
0

Ich habe Google Maps-Aktivität, die bis jetzt gut funktioniert hat. Ich weiß nicht, was passiert ist, aber die App stürzt ab, wenn "getLastKnownLocation" aufgerufen wird. Ich verstehe nicht, warum es passiert ist, wie ich schon sagte, es hat bis jetzt gut funktioniert.Google Maps-Aktivität stürzt in "getLastKnownLocation"

Dies ist der Fehler, den ich bekommen:

java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 

Und das ist meine Karte Aktivität:

public class MapActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 
    LocationManager locationManager; 
    LocationListener locationListener; 
    private DatabaseReference mDatabase; 
    private FirebaseAuth mAuth; 
    private ArrayList<User> userArrayList = new ArrayList<>(); 
    private User useri; 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (requestCode == 1) { 

      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        { 

         locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListener); 

        } 

       } 

      } 

     } 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     mDatabase = FirebaseDatabase.getInstance().getReference(); 
     mAuth = FirebaseAuth.getInstance(); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.setMyLocationEnabled(true); 
     locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 


       LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude()); 

       mMap.clear(); 
       mMap.addMarker(new MarkerOptions().position(userLocation).title("המיקום שלי")); 
       mMap.moveCamera(CameraUpdateFactory.newLatLng(userLocation)); 


      } 

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

      } 

      @Override 
      public void onProviderEnabled(String s) { 

      } 

      @Override 
      public void onProviderDisabled(String s) { 

      } 
     }; 

     if (Build.VERSION.SDK_INT < 23) { 

      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

     } else { 

      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); 

      } 
      else { 
       mMap.setMyLocationEnabled(true); 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
       Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); 
       LatLng userLocation = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); 
       mDatabase.child("Users").child(mAuth.getCurrentUser().getUid()).child("lat").setValue(lastKnownLocation.getLatitude()); 
       mDatabase.child("Users").child(mAuth.getCurrentUser().getUid()).child("lng").setValue(lastKnownLocation.getLongitude()); 
       mMap.clear(); 
       mMap.addMarker(new MarkerOptions().position(userLocation).title("המיקום שלי")); 
       mMap.moveCamera(CameraUpdateFactory.newLatLng(userLocation)); 
      } 
     } 
     showUsersOnMap(); 

    } 

    // Search for location and show it on the map 
    public void onClick(View view) { 

     if(view.getId() == R.id.searchLocationBtn){ 
      EditText searchBoxLocation = (EditText) findViewById(R.id.searchBoxLocation); 
      String location = searchBoxLocation.getText().toString(); 
      List<Address> addressList = null; 
      MarkerOptions markerOptions = new MarkerOptions(); 
      if(! location.equals("")){ 
       Geocoder geocoder = new Geocoder(this); 
       try { 
        addressList = geocoder.getFromLocationName(location, 1); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       for (int i = 0 ; i < addressList.size(); i++){ 
        Address myAddress = addressList.get(i); 
        LatLng latLng = new LatLng(myAddress.getLatitude(), myAddress.getLongitude()); 
        markerOptions.position(latLng); 
        mMap.clear(); 
        mMap.addMarker(markerOptions); 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11)); 
        searchBoxLocation.setText(""); 
       } 
      } 
     } 
     showUsersOnMap(); 
    } 

    // Function to show all the users on the map 
    public void showUsersOnMap(){ 
     mDatabase.child("Users").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot ds: dataSnapshot.getChildren()){ 
        User user = ds.getValue(User.class); 
        userArrayList.add(user); 

       } 

       for (int i = 0; i < userArrayList.size(); i++) { 
        useri = userArrayList.get(i); 

        if (useri.getLat() != 0 && useri.getLng() != 0) { 
         MarkerOptions markerOptions = new MarkerOptions(); 
         LatLng userlatLng = new LatLng(useri.getLat(), useri.getLng()); 
         markerOptions.position(userlatLng); 
         mMap.addMarker(new MarkerOptions().position(userlatLng).title(useri.getName()).snippet(useri.getPhone()) 
           .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_action_marker2))); 
         //mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng2,10)); 

        } 
        else Toast.makeText(getApplicationContext(),"ישנה בעיה. אנא נסה להתחבר למפה שוב",Toast.LENGTH_LONG).show(); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 


     }); 
    } 
} 

Ich hoffe jemand kann herausfinden, was das Problem ist. Ich suchte nach dem gleichen Problem, aber ohne Erfolg.

+0

Check überprüfen https://stackoverflow.com/questions/3435978/location-object-passed-into-onlocationchanged-is-null – Raghavendra

+0

Ich sah bereits diesen Beitrag aber es hat mir nicht geholfen – Nauruto

Antwort

0

bewegen diese Linie in oncreate und diese

locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
+0

Es funktioniert nicht .. – Nauruto

Verwandte Themen