Получить местоположение из Firebase и поставить маркер на карту Google - PullRequest
0 голосов
/ 22 марта 2020

Я создал базу данных в Firebase и попытался показать маркер на карте. Все еще не работает. что мне делать. Приложение запускается, но при открытии активности карты приложение закрывается. Я создаю базу данных вручную. Я сослался на эту ссылку: - Получить местоположение из Firebase и поставить маркер на API Google Map для android.

Это код

Карта деятельности

map. java

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.lang.reflect.Array;
import java.util.EventListener;

public class map extends FragmentActivity implements OnMapReadyCallback {

     FirebaseDatabase mDatabase;
     DatabaseReference mDatabaseReference;
     String nameddd;
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        // 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);

        nameddd = FirebaseDatabase.getInstance().getReference("Location").child("Name").toString();
        mDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mDatabase.getReference("Location");
    }
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        mDatabaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                LatLng newLocation = new LatLng(dataSnapshot.child("Latitude").getValue(Long.class),dataSnapshot.child("Longitude").getValue(Long.class));
                mMap.addMarker(new MarkerOptions().position(newLocation).title(nameddd)
                );
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

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

            }
        });
    }}

Это структура базы данных Firebase

Location
   |-2JHHhnUhYKVzAmoDvrhtUJfhGEg2
         |- ABpos: "20"
         |- Latitude: "12"
         |- Longitude: "22"
         |- Name: "Sion"

Logcat

Process: com.bloodapp.blood, PID: 5393
    com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to long
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertLong(com.google.firebase:firebase-database@@19.2.1:384)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(com.google.firebase:firebase-database@@19.2.1:295)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.2.1:214)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.2.1:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.2.1:203)
        at com.bloodapp.blood.map$1.onChildAdded(map.java:54)
        at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:79)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

1 Ответ

0 голосов
/ 22 марта 2020

Вы получаете следующую ошибку:

com.google.firebase.database.DatabaseException: не удалось преобразовать значение типа java .lang.String в long

Поскольку вы пытаетесь получить значение свойства Latitude как Long:

dataSnapshot.child("Latitude").getValue(Long.class)

Пока ваша база данных хранится в виде строки.

|- Longitude: "22"

См. Метки уравнений?

Чтобы решить эту проблему, вы должны изменить тип ваших Latitude и Longitude свойств в базе данных, чтобы они имели тип double и , а не Строка:

|- Longitude: 22.01

И получить их соответственно:

double lat = dataSnapshot.child("Latitude").getValue(Double.class)

Широта и долгота не могут быть long числами, это должно быть double, и это потому, что оба содержат десятичные дроби.

...