0

I'm reading some data from Firebase database and returned object is null.

I tried lots ways. When I have(like now in code)

marker(mMap.addMarker(new MarkerOptions().position(new LatLng(value, value2)).title("Mehehe"));) 

outside of onDataChange method the error occurs. But when i put marker in onDataChange method and set both:

DatabaseReference myRef2 = database2.getReference("latitude");

and

DatabaseReference myRef = database.getReference("latitude");

if the there are similar getRefrences there is no error but if I try

 DatabaseReference myRef2 = database2.getReference("latitude");

and

 DatabaseReference myRef = database.getReference("longitude");

Then there come similar error like when .addMarker is outside onDataChange method.

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener, View.OnClickListener {

    private ImageView imageView;

    private GoogleMap mMap;

    private GoogleApiClient client;

    private DatabaseReference mDatabase;

    private String email;

    private double latitude;
    private double longitude;

    Double value;
    Double value2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // 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);

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("samo@gmailcom - username");

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                String value = dataSnapshot.getValue(String.class);
                Log.d("TAG", "Value is: " + value);
                Toast.makeText(getApplicationContext(), value.toString(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("TAG", "Failed to read value.", error.toException());
                Toast.makeText(getApplicationContext(), error.toException().toString(), Toast.LENGTH_SHORT).show();
            }
        });

        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();

        imageView = (ImageView) findViewById(R.id.imageView);
        imageView.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {

        if (view == imageView) {

            Intent intent = new Intent(getApplicationContext(), ProfileSetUp.class);
            startActivity(intent);

        }

    }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

        mMap.setMyLocationEnabled(true);

        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();

        String provider = locationManager.getBestProvider(criteria, true);

        Location myLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
        //        Location myLocation = locationManager.getLastKnownLocation(provider);

        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        //        double latitude = myLocation.getLatitude();
        //        double longitude = myLocation.getLongitude();

        latitude = myLocation.getLatitude();
        longitude = myLocation.getLongitude();

        mDatabase = FirebaseDatabase.getInstance().getReference();

        //        mDatabase.child("latitude").setValue(latitude);
        //        mDatabase.child("longitude").setValue(longitude);

        LatLng latLng = new LatLng(latitude, longitude);

        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
        mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!").snippet("Consider yourself located"));
        //        mMap.addMarker(new MarkerOptions().position(new LatLng(48.7352022, 19.1187914)).title("You are here!").snippet("Consider yourself located"));


        FirebaseDatabase database2 = FirebaseDatabase.getInstance();
        DatabaseReference myRef2 = database2.getReference("latitude");

        myRef2.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                value2 = dataSnapshot.getValue(Double.class);
                Log.d("TAG", "Value is: " + value2);
                //                Toast.makeText(getApplicationContext(), value3.toString(), Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), value2.toString(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("TAG", "Failed to read value.", error.toException());
                //                Toast.makeText(getApplicationContext(), error.toException().toString(), Toast.LENGTH_SHORT).show();
            }

        });

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("longitude");

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                value = dataSnapshot.getValue(Double.class);
                Log.d("TAG", "Value is: " + value);

                //                mMap.addMarker(new MarkerOptions().position(new LatLng(value, value2)).title("Mehehe"));
                Toast.makeText(getApplicationContext(), value.toString(), Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), value2.toString(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("TAG", "Failed to read value.", error.toException());
                //                Toast.makeText(getApplicationContext(), error.toException().toString(), Toast.LENGTH_SHORT).show();
            }
        });

        mMap.addMarker(new MarkerOptions().position(new LatLng(value, value2)).title("Mehehe"));

    }

    @Override
    public void onLocationChanged(Location location) {



    }
}

And there is error message :-

08-15 10:47:53.591 4280-4280/com.samo.facedatefb E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.samo.facedatefb, PID: 4280
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
    at com.samo.facedatefb.MapsActivity.onMapReady(MapsActivity.java:268)
    at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source)
    at com.google.android.gms.maps.internal.zzt$zza.onTransact(Unknown Source)
    at android.os.Binder.transact(Binder.java:385)
    at xz.a(:com.google.android.gms.DynamiteModulesB:82)
    at maps.ad.u$5.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5549)
    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:964)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

My firebase Database Snippet.

enter image description here

Poger
  • 1,897
  • 18
  • 16
Samo
  • 25
  • 3
  • 9
  • Why are you using multiple instances of the exact same FirebaseDatabase object? – OneCricketeer Aug 15 '16 at 10:46
  • Aren't `value` and `value2` set to `null` when you are calling `mMap.addMarker(new MarkerOptions().position(new LatLng(value, value2)).title("Mehehe"));` ? – Poger Aug 15 '16 at 10:47

1 Answers1

0

Here is the code that you can use to get your latitude and longitude

   class Item {
    private Double longitude;
    private Double latitude;

    public Item(Double longitude, Double latitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    } 

    public Double getLatitude() {
        return latitude;
    }

    public Double getLongitude() {
        return longitude;
    }
}

your activity

class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener, View.OnClickListener {

    //...

    @Override 
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return; 
        } 

        mMap.setMyLocationEnabled(true);

        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();

        String provider = locationManager.getBestProvider(criteria, true);

        Location myLocation = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
 //        Location myLocation = locationManager.getLastKnownLocation(provider); 

        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

 //        double latitude = myLocation.getLatitude(); 
 //        double longitude = myLocation.getLongitude(); 

        latitude = myLocation.getLatitude();
        longitude = myLocation.getLongitude();

        mDatabase = FirebaseDatabase.getInstance().getReference();

 //        mDatabase.child("latitude").setValue(latitude); 
 //        mDatabase.child("longitude").setValue(longitude); 

        LatLng latLng = new LatLng(latitude, longitude);

        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
        mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!").snippet("Consider yourself located"));
 //        mMap.addMarker(new MarkerOptions().position(new LatLng(48.7352022, 19.1187914)).title("You are here!").snippet("Consider yourself located")); 

        DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();

        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Item myItem = dataSnapshot.getValue(Item.class);
                mMap.addMarker(new MarkerOptions().position(new LatLng(myItem.getLat(), myItem.getLng())).title("Buhaahaha"));
        // ...
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            });
    } 
}

Explanation It is recommended to use a model class, containing a default constructor that will will initialise its fields, the statement Item myItem = dataSnapshot.getValue(Item.class); will automatically call the constructor and initialise the corresponding value. Now, how does this statement know which value is of Latitude and and which is Longitude. Note that in our Item class, we have named our fields the same they appear in our Firebase Database. This is very important, they should be name exactly the same. Now that we have our object initialise and values set, we simply user getters to get value from the database.
Your mistake.
The statement that you have written DatabaseReference myRef = database.getReference("longitude"); means "Get the Firebase database base reference, then get the child 'longitude' reference". So basically its looking for longitude child instead of getting the longitude value.

Atif Farrukh
  • 2,219
  • 2
  • 25
  • 47