Я работаю над приложением отслеживания шины, которое содержит приложение Driver и приложение Student.Таким образом, я могу сохранить координаты из приложения драйвера в базе данных в реальном времени.но когда я попытался получить координаты и попытался показать их на карте с маркером, приложение сразу вылетало.Я не знаю, почему это происходит, и в настоящее время я слежу за видео-курсом YouTube для этого.
Помощь будет принята с благодарностью.
Так что это база данных 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) {
}
});
}
В своем выводе я получаю тост "Ключ драйвера найден", но после этого происходит сбой приложения без маркера накарта.вы, ребята, можете также посмотреть Simcoder Uber Clone Tutorial # 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 выводила, сообщите мне, что я опубликую изображение с данными в нем.