2017-08-29 94 views
0

我有谷歌地圖活動,直到現在工作得很好。我不知道發生了什麼,但是在調用「getLastKnownLocation」時應用程序崩潰。我不明白爲什麼會發生這種情況,正如我之前所說的那樣,直到現在它仍然運行良好。谷歌地圖活動崩潰在「getLastKnownLocation」

這是錯誤我得到:

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

這是我的地圖活動:

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) { 

      } 


     }); 
    } 
} 

我希望有人能找出什麼問題。我搜索了同樣的問題,但沒有成功。

+0

檢查這個https://stackoverflow.com/questions/3435978/location-object-passed-into-onlocationchanged-is-null – Raghavendra

+0

我已經看到了這個帖子但它沒有幫我 – Nauruto

回答

0

移動這條線到OnCreate中,檢查

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

它不工作.. – Nauruto