Estou recebendo esse erro ao executar a parte de localização no mapa:
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at br.com.alura.agenda.MapaFragment.centralizaEm(MapaFragment.java:63)
at br.com.alura.agenda.Localizador.onLocationChanged(Localizador.java:58)
Não consigo ver o erro e tão menos poder corrigi-los...
Segue os códigos implementados:
public class MapaActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mapa);
MapaFragment mapaFragment = new MapaFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction tx = manager.beginTransaction();
tx.replace(R.id.frame_mapa, mapaFragment);
tx.commit();
}
}
public class MapaFragment extends SupportMapFragment implements OnMapReadyCallback {
private GoogleMap mapa;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng posicaoDaEscola = pegaCoordenadaDoEndereco("Rua Vergueiro 3185, Vila Mariana, Sao Paulo");
if (posicaoDaEscola != null) {
centralizaEm(posicaoDaEscola);
// CameraUpdate update = CameraUpdateFactory.newLatLngZoom(posicaoDaEscola, 17);
// googleMap.moveCamera(update);
}
AlunoDAO alunoDAO = new AlunoDAO(getContext());
for (Aluno aluno : alunoDAO.buscaAlunos()) {
LatLng coordenada = pegaCoordenadaDoEndereco(aluno.getEndereco());
if (coordenada != null) {
MarkerOptions marcador = new MarkerOptions();
marcador.position(coordenada);
marcador.title(aluno.getNome());
marcador.snippet(String.valueOf(aluno.getNota()));
googleMap.addMarker(marcador);
}
}
alunoDAO.close();
new Localizador(getContext(), new MapaFragment());
}
public void centralizaEm(LatLng posicaoDaEscola) {
if (posicaoDaEscola != null) {
CameraUpdate update = CameraUpdateFactory.newLatLngZoom(posicaoDaEscola, 17);
mapa.moveCamera(update);
}
}
private LatLng pegaCoordenadaDoEndereco(String endereco) {
try {
Geocoder geocoder = new Geocoder(getContext());
List<Address> resultados =
geocoder.getFromLocationName(endereco, 1);
if (!resultados.isEmpty()) {
LatLng posicao = new LatLng(resultados.get(0).getLatitude(), resultados.get(0).getLongitude());
return posicao;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
public class Localizador implements GoogleApiClient.ConnectionCallbacks, LocationListener {
private final GoogleApiClient client;
// guardamos o fragment ao invés do mapa agora
private final MapaFragment mapaFragment;
public Localizador(Context context, MapaFragment mapaFragment) {
client = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.build();
client.connect();
// guardamos a referência para o fragment agora
this.mapaFragment = mapaFragment;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
LocationRequest request = new LocationRequest();
request.setSmallestDisplacement(50);
request.setInterval(1000);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(client, request, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onLocationChanged(Location location) {
LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
// aqui usamos o método que implementamos no fragment
mapaFragment.centralizaEm(coordenada);
}
}