gpt4 book ai didi

java - 如何从 Firebase 数据库检索纬度和经度到 Android map 应用程序

转载 作者:行者123 更新时间:2023-12-02 01:40:31 25 4
gpt4 key购买 nike

我正在开发一个公交车跟踪应用程序,其中包含司机应用程序和学生应用程序。所以我可以将驱动程序应用程序的坐标存储到 firebase 实时数据库中。但是当我尝试检索坐标并尝试用标记在 map 上显示它们时,应用程序立即崩溃。我不知道为什么会发生这种情况,我目前正在观看 YouTube 视频类(class)。

非常感谢您的帮助。

所以这是一个 Firebase 数据库,所以我授予了读取和写入的权限,只是为了测试目的,它应该就像当我按下按钮时,它应该找到最近的公交车乘客,从中检索坐标firebase 并将其存储在双变量中并在 map 上显示它们。

因此,对于驱动程序,我使用 Geofire 将位置存储在 firebase 中,这是代码:

   @Override
public void onLocationChanged(Location location) {
if(getApplicationContext() != null){

mLastLocation = location;

mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new
LatLng(location.getLatitude(), location.getLongitude()), 16.5f));

String UserId =
Objects.requireNonNull(FirebaseAuth.getInstance()
.getCurrentUser()).getUid();
DatabaseReference refAvail = FirebaseDatabase.getInstance().getReference("Location").child("Driver");

GeoFire geoFire = new GeoFire(refAvail);
geoFire.setLocation(UserId, new GeoLocation(location.getLatitude(), location.getLongitude()));
}
}

对于客户端应用程序,我已经尝试过:

mCFS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pickuplocation = new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude());

mMap.addMarker(new
MarkerOptions().position(pickuplocation).title("Student is here"));

mCFS.setText("Sending Location");

getClosestDriver();

}
});
}

带有一些变量的 getClosestDriver() 和 getDriverLocation() 方法:

private int radius = 1;

private Boolean driverFound = false;
private String driverFoundID;

private void getClosestDriver(){
DatabaseReference DriverLocation =
FirebaseDatabase.getInstance().getReference("Location").child("Driver");

GeoFire geoFire = new GeoFire(DriverLocation);

GeoQuery geoQuery = geoFire.queryAtLocation(new
GeoLocation(pickuplocation.latitude, pickuplocation.longitude), radius);
geoQuery.removeAllListeners();

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
if(!driverFound)
{
driverFound = true;
driverFoundID = key;
Toast.makeText(getApplicationContext(), "Driver KEY
Found", Toast.LENGTH_SHORT).show();

getDriverLocation();
mCFS.setText("Looking For Driver Location");
}
}

@Override
public void onKeyExited(String key) {

}

@Override
public void onKeyMoved(String key, GeoLocation location) {

}

@Override
public void onGeoQueryReady() {
if(!driverFound){
radius++;
getClosestDriver();
}
}

@Override
public void onGeoQueryError(DatabaseError error) {

}
});
}


Marker mMarker;
private void getDriverLocation(){
DatabaseReference DLref =
FirebaseDatabase.getInstance().getReference("Location")
.child("Driver").child(driverFoundID).child("l");
DLref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
List<Objects> map = (List<Objects>)
dataSnapshot.getValue();
double locationLat = 0;
double locationLng = 0;
mCFS.setText("Driver Found");

assert map != null;
if(map.get(0) != null){
locationLat =
Double.parseDouble(map.get(0).toString());
}

if(map.get(1) != null){
locationLng =
Double.parseDouble(map.get(1).toString());
}
LatLng DriverLatLng = new LatLng(locationLat,
locationLng);
if(mMarker != null){
mMarker.remove();
}
mMarker = mMap.addMarker(new
MarkerOptions().position(DriverLatLng).title("Bus"));
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});

}

在我的输出中,我得到了 Toast“找到驱动程序 key ”,但之后应用程序崩溃了, map 上没有任何标记。你们还可以观看 Simcoder Uber Clone 教程 #7,8,9,我已经按照该教程获得了我想要的输出。

这是应用程序崩溃后的 Logcat 输出:

02-03 10:28:13.023 32241-32241/com.example.clientapplication 
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.clientapplication, PID: 32241
java.lang.ClassCastException: java.lang.Double cannot be cast to
java.util.Objects
at
com.example.clientapplication.ClientMap$4.onDataChange
(ClientMap.java:163)
at

com.google.firebase.database.core.ValueEventRegistration.fireEvent
(com.google.firebase:firebase-database@@16.0.6:75)
at
com.google.firebase.database.core.view.DataEvent.fire
(com.google.firebase:firebase-database@@16.0.6:63)
at
com.google.firebase.database.core.view.EventRaiser$1.run
(com.google.firebase:firebase-database@@16.0.6:55)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5601)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:774)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)

如果你们想要我的 Firebase 数据库输出,请告诉我,我将发布包含数据的图像。

最佳答案

您可以使用数据库引用类的以下方法从 Firebase 检索数据。

//Get the reference of parent node...
firebaseDatabase= FirebaseDatabase.getInstance()
databaseReference=firebaseDatabase?.getReference("student")

//Create the listener to fetch data...
databaseReference?.addValueEventListener(object :ValueEventListener{
override fun onCancelled(p0: DatabaseError)
{ }

override fun onDataChange(p0: DataSnapshot)
{
lststudent.clear()
var child=p0.children
child.forEach {
var map=it.value as HashMap<String, String>
lststudent.add(map)
}
//here you have to use the data fetch from real time databse in outside this method it will reset the data...
lvstud.adapter= SimpleAdapter(this@MainActivity,
lststudent,
R.layout.student,
arrayOf("studname","studmobno"),
intArrayOf(R.id.tvStudname,R.id.tvStudmobno))
}
})

关于java - 如何从 Firebase 数据库检索纬度和经度到 Android map 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com