Как получить значение hashmap для метода datasnapshot ondatachanged?
Проблема:
Я могу хранить свои координаты местоположения(lat и long) в своей базе данных Firebase с помощью HashMap, но я не знаю, как вызвать значение HashMap в метод onDataChanged для DataSnapshot.
Что работает:
Я распечатал значения широты и долготы на своем logcat, и моя хэш-карта имеет это значение. Ниже приведен мой SmsReceiver.class который считывает входящие сообщения и сохраняет эти данные в базе данных Firebase.
Мой MapActivity.class в настоящее время показывает координаты по умолчанию для отображения на карте. Я запутался в том, как я собираюсь получить доступ к значению HashMap из SmsReceiver.class чтобы отобразить маркер на карте GoogleMap.
Что я уже пробовал:
public void sendDataToFirebase(SmsMessage sms, Context context) { FirebaseApp.initializeApp(context); databaseLocation = FirebaseDatabase.getInstance().getReference("database"); String senderNumber = sms.getOriginatingAddress(); String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); String message = sms.getMessageBody(); String[] separatedSMS = message.split("\\s+"); DatabaseReference mRef = databaseLocation.push(); double latitudedb = Double.parseDouble(separatedSMS[1]); double longitudedb = Double.parseDouble(separatedSMS[3]); HashMap<String,Double> coordinates = new HashMap<String,Double>(); coordinates.put("latitude", latitudedb); coordinates.put("longitude", longitudedb); mRef.setValue(coordinates); coordinates.get("latitude"); coordinates.get("longitude"); mRef.getKey(); System.out.println(coordinates.get("latitude")); System.out.println(coordinates.get("longitude")); }
Это мое MapActivity.class.
public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setMinZoomPreference(15.0f); mMap.setMaxZoomPreference(20.0f); final LatLng putatan = new LatLng(14.397420, 121.033051); final DatabaseReference mRef = FirebaseDatabase.getInstance().getReference("conilocationdata"); ValueEventListener postListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Get Post object and use the values to update the UI for(DataSnapshot ds : dataSnapshot.getChildren()) { // This is where I should be accessing the HashMap value but I have no idea on the syntax. //This is the default marker. marker = mMap.addMarker(new MarkerOptions() .position(putatan) .title("Here") .flat(true)); mMap.moveCamera(CameraUpdateFactory.newLatLng(putatan)); } } @Override public void onCancelled(DatabaseError databaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); // ... } }; mRef.orderByKey().limitToLast(1).addValueEventListener(postListener);
David Crow
Если вам нужно сопоставить только одну пару координат, вы можете: 1) сохранить их в области настроек вашего приложения и получить их из той же внутренней части приложения. onDataChange()
, или 2) сохраните их в своем классе приложений (этот класс не создается по умолчанию), или 3) передайте их в свой класс приложений. MapActivity
класс с помощью Intent
.
Если вам нужно сопоставить несколько координат, эти же решения будут работать, но они могут быть не самыми эффективными.
sfdgasdfqqqq
Привет. Это то, что я пробовал, но я получаю ошибку NullObjectReference на моем LatLng.
HashMap <string, double=""> hashMap = smsReceiver.getLocMap(координаты);
if(hashMap != null) {
// Double lat = hashMap.get("широта");
// Двойной долгота = хранилище HashMap.вам("восточной долготы");
Расположение latlng с = новый latlng с(координаты.вам("широта"),координаты.вам("восточной долготы"));
marker = mMap.addMarker(новые Маркеропции()
.определение местоположения)
название("здесь")
.квартира(правда));
вызов mmap.moveCamera(CameraUpdateFactory.newLatLng(расположение));
Это мой класс а с моей хэш-картой.
//переменная
частная хранилище HashMap и Л;строка, двойной=""&ГТ; координаты = новый HashMap и Л;строка, двойной=""&ГТ;();
public void sendDataToFirebase(SmsMessage sms, Context context) {
координаты.put("широта", latitudedb);
координаты.put("долгота", longitudedb);
mRef.setValue(координаты);
Double lcoords = координаты.get("широта");
Double lcoords2 = координаты.get("долгота");
форума MREF.getKey();
Системы.из.код println(lcoords);
Системы.из.код println(lcoords2);
// }
}
общественное хранилище HashMap и Л;строка, двойной=""&ГТ; getLocMap(хранилище HashMap и Л;строка, двойной=""&ГТ; координирует) {
вернуть это.координаты;
}
Когда я распечатываю свои координаты, у него есть значения.
sfdgasdfqqqq
Кроме того, я попытался использовать Intent, но он говорит, что не может разрешить конструктор. Может быть, потому, что SmsReceiver-это всего лишь класс, а не само действие.
David Crow
Вы уже используете намерение при отображении карты, предположительно что-то вроде:
Intent intent = new Intent(this, MapActivity.class); intent.putExtra(...); startActivity(intent, REQUEST_MAP);
sfdgasdfqqqq
Я передаю двойной тип данных. Я вставил этот код:
Intent toMap = новое намерение(контекст,MapActivity.class);
Расслоение координаты = новый пакет();
coords.putDouble("лат",lcoords);
coords.putDouble("lon",lcoords2);
toMap.putExtras(координаты);
контекст.startActivity(toMap);
Системы.из.печать(координаты);
lcoords содержит широту. lcoords2 содержит долготу. Всякий раз, когда я получаю доступ к связке с моим MapActivity.class, он говорит: "getDouble по ссылке на нулевой объект"
Расслоение координаты = так().getBundleExtra("координаты");
double lat1 = coords.getDouble("lat");
double lon2 = coords.getDouble("lon");
LatLng location = новый LatLng(lat1,lon2);
marker = mMap.addMarker(новые Маркеропции()
.определение местоположения)
название("здесь")
.квартира(правда));
вызов mmap.moveCamera(CameraUpdateFactory.newLatLng(расположение));
Если я закомментирую эти коды, то lcoords и lcoords2 имеют значения и не являются нулевыми.
David Crow
toMap.putExtras(coords); ... Bundle coords = getIntent().getBundleExtra("coords");
Эти два понятия не совпадают. Прочитайте документация чтобы выяснить почему.
sfdgasdfqqqq
если я собираюсь использовать getExtras(), getDOuble в этом коде создает исключение нулевого указателя.
double lat1 = coords.getDouble("lat");
David Crow
"...этот код создает исключение нулевого указателя."
Конечно, потому что getBundleExtra()
не найти пакет под названием "координаты". Возможно, вы оставили проверку ошибок для краткости, но если нет, то вам действительно следует рассмотреть возможность ее использования. Это сэкономит вам кучу времени и нервов.
sfdgasdfqqqq
Intent toMap = новое намерение(контекст,MapActivity.class);
Расслоение координаты = новый пакет();
coords.putDouble("лат",lcoords);
coords.putDouble("lon",lcoords2);
контекст.startActivity(toMap);
Это моя пачка, координаты.