Google Map API v2 no actualiza Maps una vez que se reinicie la aplicación
He escrito una aplicación en android con Google Maps Api V2. La aplicación, básicamente, ejecuta un servicio detrás y los informes de ubicación de la actividad donde Google Map se agrega utilizando SupportMapFragment.
Cuando inicio la aplicación, todo parece funcionar bien y los mapas se actualizan. El problema es cuando vuelvo a pulsar el botón o la pantalla se apaga y volver a la aplicación de Google Maps deje de funcionar. La localización todavía se divulga y llamo el método de moveCamera en el objeto del mapa.
- ¿Cómo mantener el marcador en la carretera? Google Maps Android
- Google Maps de Google - Error al inflar el fragmento de clase
- Cómo adjuntar un marcador flexible en el mapa algo así como Uber y Lyft?
- Google Maps API V2 desaparecidos de google-play-services_lib.jar
- La biblioteca de soporte de Android v4 y la API de Google Maps rompen la compilación
public class GpsTracker extends android.support.v4.app.FragmentActivity { public static final int GPS_LOCATION_UPDATE = 0; public static final int NETWORK_LOCATION_UPDATE = 1; public static final int LOCATION_NETWORK_UNAVAILABLE = 2; public static final int LOCATION_GPS_UNAVAILABLE = 3; private static String gpsTrackerTag = "GpsTracker:MainActivity"; private GoogleMap mMap; private PolylineOptions mpolyOptions = new PolylineOptions(); GpsTrackerMyService myservice = null; ServiceConnection sc = null; static MyHandlerCallback myCallback = null; //private Boolean mServiceRunning = false; // Initial State When service is yet not started. private Boolean mServiceBinded = false; public static Callback CallBackHandler() { return myCallback; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gps_tracker); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); if (savedInstanceState == null) { // First incarnation of this activity. mapFragment.setRetainInstance(true); } else { // Reincarnated activity. The obtained map is the same map instance in the previous // activity life cycle. There is no need to reinitialize it. mMap = mapFragment.getMap(); } InitializeActivity(); setUpMapIfNeeded(); } @Override protected void onPause() { super.onPause(); if(mServiceBinded) { unbindService(sc); mServiceBinded = false; Log.d(gpsTrackerTag, "onPause(): Unbinded from the Serivce"); } else Log.d(gpsTrackerTag, "onPause(): Service Already in not Bind State"); } @Override protected void onResume() { super.onResume(); if(GpsTrackerMyService.isInstanceCreated() == true) { bindService(new Intent(this, GpsTrackerMyService.class), sc, 0); mServiceBinded = true; Log.d(gpsTrackerTag, "onResume(): Binded to the Service"); } else Log.d(gpsTrackerTag, "onResume(): Service Not Running"); setUpMapIfNeeded(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_gps_tracker, menu); return true; } private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } } } private void setUpMap() { // mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); } private void InitializeActivity() { if(myCallback == null) myCallback = new MyHandlerCallback(); if(sc == null){ sc = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mServiceBinded = false; CharSequence text = "Service DisConnected"; Toast t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); Log.d(gpsTrackerTag, "Service Disconnected "); } @Override public void onServiceConnected(ComponentName name, IBinder service) { myservice = ((MyBinder) service).getService(); mServiceBinded = true; Log.d(gpsTrackerTag, "Service Connected "); } }; } } public void startButton_Click(View view) { if(GpsTrackerMyService.isInstanceCreated() == false) { Intent serviceIntent = startService(); bindService(serviceIntent); Log.d(gpsTrackerTag, "startButton_Click(): Service Started and Called for bind"); } else Log.d(gpsTrackerTag, "startButton_Click(): Service Already Running"); } private void bindService(Intent serviceIntent) { bindService(serviceIntent, sc, 0 ); } private Intent startService() { Intent serviceIntent = new Intent(this, GpsTrackerMyService.class); startService(serviceIntent); return serviceIntent; } public void stopButton_Click(View view) { stopService(); } private void stopService() { if(GpsTrackerMyService.isInstanceCreated() == true) { Log.d(gpsTrackerTag, "stopService(): Service Running Calling Stop on the Service"); myservice.stopSelf(); } else Log.d(gpsTrackerTag, "stopService(): Service Already Stopped"); } public class MyHandlerCallback implements Callback { @Override public boolean handleMessage(Message arg0) { Location l; CharSequence text; Toast t; LatLng mLatLng; int pos = 1; switch(arg0.what) { case GpsTracker.LOCATION_NETWORK_UNAVAILABLE: text = "Network Location Unavailable"; t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.NETWORK_LOCATION_UPDATE: l = ((Location)arg0.obj); mLatLng = new LatLng(l.getLatitude(), l.getLongitude()); mpolyOptions.add(mLatLng).width(2).color(Color.BLACK).geodesic(true); mMap.addPolyline(mpolyOptions); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 12)); mMap.addMarker(new MarkerOptions() .position(mLatLng) .title("Pos " + pos)); //text = ((Location)arg0.obj).toString(); t = Toast.makeText(getApplicationContext(), "Network Location Update", Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.GPS_LOCATION_UPDATE: l = ((Location)arg0.obj); mLatLng = new LatLng(l.getLatitude(), l.getLongitude()); //mpolyOptions.add(mLatLng).width(2).color(Color.BLACK).geodesic(true); //mMap.addPolyline(mpolyOptions); boolean check = mMap.isMyLocationEnabled(); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 12)); //text = ((Location)arg0.obj).toString(); t = Toast.makeText(getApplicationContext(), "GPS Location Update", Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.LOCATION_GPS_UNAVAILABLE: text = "Gps Location Unavailable"; t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); return true; default: return false; } } }
En el caso MyCallBackHandler GPS_LOCATION_UPDATE el mapa no mueve la cámara.
- Esta aplicación no se ejecutará a menos que actualice Google Play Services.
- Android Maps v2 rotar mapaVer con brújula
- Cómo mostrar la ubicación actual como flecha en Google Maps Android API V2?
- Dibuje cinco círculos transparentes en el mapa google v2 tomando la ubicación actual como el centro del círculo
- Cómo animar google map v2 marcador en la ruta de la polilínea?
- Cómo deshabilitar el marcador de mapa android
- Problemas con los mapas de Android apiv2 después de firmar apk
- Error de error de autorización de Google
Creo que su problema está relacionado con la clase interna no estática CallBack
. Cuando su actividad es recreada, usted mantiene una referencia estática a ella en myCallBack
, que en sí tiene una referencia implícita a su antigua Activity
. No sólo es una fuga de memoria, sino que cuando invoca el CallBack
está buscando las variables de una antigua actividad. Consulte esta publicación para obtener más información sobre pérdidas de memoria y clases internas no estáticas.
Si realiza una nueva Callback
cuando Callback
una nueva actividad, debería resolver el problema. Por lo tanto, en su InitializeActivity
, el cambio
if(myCallback == null) myCallback = new MyHandlerCallback();
a
myCallback = new MyHandlerCallback();