Как добавить маркер на гугл карте
Я зделал код которий принимает координати с ардуино и мне теперь нужно вивести маркер поза функцией OnMapReady. Как мне ето зделать? Может нужно визвать OnMapReady в функцие в которой мне нужно создать маркер? ''' package com.example.mapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
private static final String TAG = "BluetoothTerminal";
private static final int REQUEST_ENABLE_BT = 1;
private static final int REQUEST_PERMISSIONS = 2;
private static final UUID HC06_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
public GoogleMap myMap;
private BluetoothAdapter bluetoothAdapter;
private BluetoothDevice connectedDevice;
private BluetoothSocket bluetoothSocket;
private OutputStream outputStream;
private InputStream inputStream;
private TextView messageTxt;
private Marker currentMarker;
public double latitude1 = 50;//50.277073;
public double longitude1 = 30;//30.298515;
//private Marker arduino;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messageTxt = findViewById(R.id.textView);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth не підтримується", Toast.LENGTH_LONG).show();
finish();
}
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
//buttonConnect.setOnClickListener(v -> connectToHC06());
connectToHC06();
//updateMapLocation(latitude1, longitude1);
}
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
myMap = googleMap;
// Додайте перевірку для ініціалізації карти
LatLng newLocation = new LatLng(latitude1, longitude1);
myMap.addMarker(new MarkerOptions().position(newLocation).title("Arduino"));
/*if (longitude1 != 0 & latitude1 !=0) {
updateMapLocation(latitude1, longitude1);
}*/
// Переміщуємо камеру на нову локацію
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation, 15));
}
private void connectToHC06() {
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.BLUETOOTH_CONNECT},
REQUEST_PERMISSIONS);
@SuppressLint("MissingPermission")
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if (device.getName().equals("HC-06")) {
connectedDevice = device;
break;
}
}
}
if (connectedDevice == null) {
Toast.makeText(this, "HC-06 не знайдено серед спарених пристроїв", Toast.LENGTH_SHORT).show();
return;
}
try {
bluetoothSocket = connectedDevice.createRfcommSocketToServiceRecord(HC06_UUID);
bluetoothSocket.connect();
outputStream = bluetoothSocket.getOutputStream();
inputStream = bluetoothSocket.getInputStream();
Toast.makeText(this, "Підключено до HC-06", Toast.LENGTH_SHORT).show();
startListening();
} catch (IOException e) {
Log.e(TAG, "Помилка підключення", e);
Toast.makeText(this, "Помилка підключення до HC-06", Toast.LENGTH_SHORT).show();
}
}
private void startListening() {
if (inputStream == null) {
Toast.makeText(this, "Вхідний потік не ініціалізовано", Toast.LENGTH_SHORT).show();
return;
}
new Thread(() -> {
byte[] buffer = new byte[1024]; // Буфер для збереження отриманих даних
int bytes; // Кількість отриманих байтів
StringBuilder messageBuffer = new StringBuilder(); // Буфер для збирання повідомлень
while (true) {
try {
// Читання вхідних даних з Bluetooth
bytes = inputStream.read(buffer);
String receivedFragment = new String(buffer, 0, bytes);
// Додаємо фрагмент до загального буфера
messageBuffer.append(receivedFragment);
// Перевіряємо наявність термінатора (';')
int endIndex;
while ((endIndex = messageBuffer.indexOf(";")) != -1) {
// Виділяємо повне повідомлення
String completeMessage = messageBuffer.substring(0, endIndex);
messageBuffer.delete(0, endIndex + 1); // Видаляємо оброблене повідомлення з буфера
// Обробка повідомлення
parseLocationData(completeMessage);
}
} catch (IOException e) {
Log.e(TAG, "Помилка під час читання з вхідного потоку Bluetooth", e);
break;
}
}
}).start();
}
private void parseLocationData(String data) {
// Перевірка, чи рядок має правильний формат
if (data == null || !data.contains("Latitude:") || !data.contains("Longitude:")) {
Log.e(TAG, "Неправильний формат даних: " + data);
return;
}
//updateMapLocation(data);
// Розділяємо рядок на частини
String[] parts = data.split(", ");
String latitudePart = parts[0].replace("Latitude:", "").trim();
String longitudePart = parts[1].replace("Longitude:", "").trim();
// Перетворюємо рядки на числа
latitude1 = Double.parseDouble(latitudePart);
longitude1 = Double.parseDouble(longitudePart);
updateMapLocation(latitude1, longitude1);
/*try {
// Розділяємо рядок на частини
String[] parts = data.split(", ");
String latitudePart = parts[0].replace("Latitude:", "").trim();
String longitudePart = parts[1].replace("Longitude:", "").trim();
// Перетворюємо рядки на числа
latitude1 = Double.parseDouble(latitudePart);
longitude1 = Double.parseDouble(longitudePart);
//updateMapLocation(latitude1, longitude1);
// Виводимо широту та довготу
Log.d(TAG, "Широта: " + latitude1 + ", Довгота: " + longitude1);
// Оновлюємо карту
} catch (Exception e) {
Log.e(TAG, "Помилка розбору даних: " + data, e);
}*/
}
public void updateMapLocation(double latitude, double longitude) {
//public void updateMapLocation(String goodday) {
Log.d(TAG, "Широта: " + latitude1 + ", Довгота: " + longitude1);
if (myMap == null) {
Log.e(TAG, "Карта ще не готова для оновлення локації");
return;
}
//myMap.clear(); // Очищаємо всі
LatLng newLocation = new LatLng(latitude, longitude);
myMap.addMarker(new MarkerOptions()
.position(newLocation)
.title("Arduino"));
return;
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation, 15));
}
}'''