Java 从Firebase检索位置数据未在MapActivity上获取
因此,我试图从数据库引用路径“Driver Location”中获取Java 从Firebase检索位置数据未在MapActivity上获取,java,android,firebase,google-maps,firebase-realtime-database,Java,Android,Firebase,Google Maps,Firebase Realtime Database,因此,我试图从数据库引用路径“Driver Location”中获取纬度和经度。但是,它只会显示普通的谷歌地图,而不会触发定位。请帮忙 public class StudentMapActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; private DatabaseReference databaseReference; @Override
纬度
和经度
。但是,它只会显示普通的谷歌地图,而不会触发定位。请帮忙
public class StudentMapActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_student_map);
FirebaseDatabase database = FirebaseDatabase.getInstance();
databaseReference = database.getReference("Driver Location");
// 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);
}
@Override
public void onMapReady(final GoogleMap googleMap) {
mMap = googleMap;
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
String lat = child.child("latitude").getValue().toString();
String lng = child.child("longitude").getValue().toString();
double latitude = Double.parseDouble(lat);
double longitude = Double.parseDouble(lng);
LatLng latLng = new LatLng(latitude, longitude);
MarkerOptions markerOptions = new MarkerOptions()
.position(latLng)
.title("Bus is here");
mMap.addMarker(markerOptions);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
日志:
2020-07-24 00:41:18.926 22586-22586/com.example.upmbus D/InputTransport: Input channel destroyed: '1df605 ', fd=100
2020-07-24 00:41:18.939 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getLong(Ljava/lang/Object;J)J (greylist,core-platform-api, linking, allowed)
2020-07-24 00:41:18.940 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->putLong(Ljava/lang/Object;JJ)V (greylist, linking, allowed)
2020-07-24 00:41:18.942 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; (greylist, linking, allowed)
2020-07-24 00:41:18.942 22586-23234/com.example.upmbus W/.example.upmbu: Accessing hidden method Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I (greylist, linking, allowed)
数据库详情见附件
无需循环通过
DataSnapshot
对象,因为您在其中只有两个属性,并且可以像以下代码行那样直接访问这两个属性:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference driverLocationRef = rootRef.child("Driver Location");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double latitude = dataSnapshot.child("latitude").getValue(Double.class);
double longitude = dataSnapshot.child("longitude").getValue(Double.class);
Log.d("TAG", latitude + ", " + longitude);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
}
};
driverLocationRef.addListenerForSingleValueEvent(valueEventListener);
logcat中的结果将是:
3.0227801, 101.71208
除此之外,使用:
String lng = child.child("longitude").getValue().toString();
没有任何意义,因为两个属性都有一个双值,而不是一个字符串。@AlexMamo你能帮我吗?嗨,诺贝尔,但问题是什么?这段代码中到底有什么东西没有按您期望的方式工作?地图会打开,但不会获取位置值,也不会放置任何标记,仅一个普通地图@AlexMamoI已成功存储纬度和经度,但无法使用提供的代码avobe检索它。请将您的数据库结构添加为JSON文件,或至少添加一个screenshot.com.example.upmbus D/AndroidRuntime:shutdown VM com.example.upmbus E/AndroidRuntime:FATAL EXCEPTION:main Process:com.example.upmbus,PID:31676 java.lang.NullPointerException:尝试在com.google.firebase.database.Query$1.onDataChange(Query.java:179)上的null对象referencecom.example.upmbus.StudentMapActivity$1.onDataChange(StudentMapActivity.java:79)上调用虚拟方法“double java.lang.double.doubleValue()”位于com.google.firebase.database.core.ValueEventRegistration.firevent(ValueEventRegistration.java:75)位于com.google.firebase.DataEvent.fire(DataEvent.java:63)位于com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)位于android.os.Handler.handleCallback(Handler.java:883)android.app.ActivityThread.main(ActivityThread.java:7948)的android.os.Handler.dispatchMessage(Handler.java:100)的android.os.Looper.loop(Looper.java:237)的java.lang.reflect.Method.invoke(本机方法)的com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)上,请编辑您的问题并添加您正在使用的确切代码。您好!你解决问题了吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头的左边。应该换成绿色。我真的很感激。谢谢!