Android 使用UID从Firebase检索位置并放入Google地图
我正试图从Android 使用UID从Firebase检索位置并放入Google地图,android,google-maps,firebase,firebase-realtime-database,google-api,Android,Google Maps,Firebase,Firebase Realtime Database,Google Api,我正试图从Firebase保存和检索一个位置,并将其放入谷歌地图。纬度和经度值位于用户id下,因为它将用于特定用户的位置。保存位置成功,但我无法检索它。我正试图找回它,但我一直在找它 java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的“double java.lang.double.doubleValue()” 错误 有什么办法可以解决这个问题吗?谢谢你 以下是保存位置的代码: profDatabase = FirebaseDatabase.g
Firebase
保存和检索一个位置,并将其放入谷歌地图。纬度和经度值位于用户id下,因为它将用于特定用户的位置。保存位置成功,但我无法检索它。我正试图找回它,但我一直在找它
java.lang.NullPointerException:尝试调用虚拟方法
空对象引用上的“double java.lang.double.doubleValue()”
错误
有什么办法可以解决这个问题吗?谢谢你
以下是保存位置的代码:
profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");
if (auth.getCurrentUser() != null){
String userid = auth.getCurrentUser().getUid();
final DatabaseReference locDatabase = FirebaseDatabase.getInstance()
.getReferenceFromUrl("https://sholoco-9cf1e.firebaseio.com/Profile/" + userid);
profDatabase.child(userid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String stallname = dataSnapshot.child("StallName").getValue().toString();
Marker marker = mMap.addMarker(new
MarkerOptions().position(point).title(stallname));
final LatLng latlng = marker.getPosition();
mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//DatabaseReference newPost = profDatabase.push();
//newPost.setValue(latlng);
String latkey = "latitude";
double latvalue = latlng.latitude;
DatabaseReference child = locDatabase.child(latkey);
child.setValue(latvalue);
String longkey = "longitude";
double longvalue = latlng.longitude;
child = locDatabase.child(longkey);
child.setValue(longvalue);
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");
if (auth.getCurrentUser() != null) {
String userid = auth.getCurrentUser().getUid();
profDatabase.child(userid).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
double latt = (double) dataSnapshot.child("latitude").getValue();
double longg = (double) dataSnapshot.child("longitude").getValue();
String stallname = dataSnapshot.child("StallName").getValue().toString();
LatLng newLocation = new LatLng(latt, longg);
mMap.addMarker(new MarkerOptions()
.position(newLocation)
.title(stallname));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
以下是我检索位置的代码:
profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");
if (auth.getCurrentUser() != null){
String userid = auth.getCurrentUser().getUid();
final DatabaseReference locDatabase = FirebaseDatabase.getInstance()
.getReferenceFromUrl("https://sholoco-9cf1e.firebaseio.com/Profile/" + userid);
profDatabase.child(userid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String stallname = dataSnapshot.child("StallName").getValue().toString();
Marker marker = mMap.addMarker(new
MarkerOptions().position(point).title(stallname));
final LatLng latlng = marker.getPosition();
mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//DatabaseReference newPost = profDatabase.push();
//newPost.setValue(latlng);
String latkey = "latitude";
double latvalue = latlng.latitude;
DatabaseReference child = locDatabase.child(latkey);
child.setValue(latvalue);
String longkey = "longitude";
double longvalue = latlng.longitude;
child = locDatabase.child(longkey);
child.setValue(longvalue);
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
profDatabase = FirebaseDatabase.getInstance().getReference().child("Profile");
if (auth.getCurrentUser() != null) {
String userid = auth.getCurrentUser().getUid();
profDatabase.child(userid).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
double latt = (double) dataSnapshot.child("latitude").getValue();
double longg = (double) dataSnapshot.child("longitude").getValue();
String stallname = dataSnapshot.child("StallName").getValue().toString();
LatLng newLocation = new LatLng(latt, longg);
mMap.addMarker(new MarkerOptions()
.position(newLocation)
.title(stallname));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我的数据库中的屏幕截图:
您是否尝试过使用
addListenerForSingleValueEvent()
代替addChildEventListener()
要获取不带用户ID的值,请执行以下操作:
提及
您不需要将纬度和经度输入到
double
,而是将double.class
作为参数传递到getValue()
请参阅此代码的工作原理
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationsRef = rootRef.child("childName");
final GeoFire geoFire = new GeoFire(locationsRef);
geoFire.getLocation("dataKey", new LocationCallback() {
@Override
public void onLocationResult(String key, GeoLocation location) {
double lat =location.latitude;
double lng =location.longitude;
LatLng sydney = new LatLng(lng, lat);
mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.defaultMarker(HUE_BLUE)).position(sydney).title("car"));
Toast.makeText(getApplicationContext(),""+sydney,Toast.LENGTH_SHORT).show();
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
mMap.animateCamera(CameraUpdateFactory.zoomTo(9));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mMap = googleMap;
mMap.setMyLocationEnabled(true);
buildGoogleApiClient();
}
这实际上是我的第一个代码,但它仍然不起作用。顺便问一下,什么意思是将数据存储在列表中?(对不起,我问了很多)我删除了没有位置的其他用户,并留下了有位置的用户,它工作了。但我在创建并尝试保存位置时出错。当我尝试保存另一个用户的位置时,应用程序崩溃,并出现以下错误:java.lang.NullPointerException:尝试调用虚拟方法'double java.lang.double.doubleValue()'在此行的空对象引用上(使用userid):
double latt=(double)dataSnapshot.child(“纬度”).getValue();