Как получить широту и долготу из базы данных Firebase в приложение карты Android - PullRequest
0 голосов
/ 03 февраля 2019

Я работаю над приложением отслеживания шины, которое содержит приложение 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 выводила, сообщите мне, что я опубликую изображение с данными в нем.

1 Ответ

0 голосов
/ 03 февраля 2019

Вы можете получить данные из 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))
            }
})
...