Android googleMap Mapa no muestra, sólo la cuadrícula, a veces

Así pues, he estado trabajando en conseguir esto para arriba y funcionando por algún tiempo ahora. El problema es que tengo mi clave de mapa de Google colocado correctamente en main.xml, pero no puedo obtener una información de proveedor como el mapa no se muestra en absoluto. He corrido un par de veces y el fallo en el mismo lugar. Intenté depurar y noté que hay una cadena de proveedor devuelta, sin embargo, después de que un nulo.

El código falla en

@Override protected void onResume() { super.onResume(); locationManager .requestLocationUpdates(getBestProvider(), 1000, 1, this); } 

Con el siguiente mensaje de error.

 08-20 05:14:43.573: E/AndroidRuntime(239): Uncaught handler: thread main exiting due to uncaught exception 08-20 05:14:43.583: E/AndroidRuntime(239): java.lang.RuntimeException: Unable to resume activity {com.shawnbe.mallfinder/com.shawnbe.mallfinder.MallFinderActivity}: java.lang.NullPointerException 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2965) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2516) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Handler.dispatchMessage(Handler.java:99) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Looper.loop(Looper.java:123) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.main(ActivityThread.java:4363) 08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invokeNative(Native Method) 08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invoke(Method.java:521) 08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 08-20 05:14:43.583: E/AndroidRuntime(239): at dalvik.system.NativeStart.main(Native Method) 08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException 08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Activity.performResume(Activity.java:3763) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2937) 08-20 05:14:43.583: E/AndroidRuntime(239): ... 12 more 

Ocasionalmente, el código parece lanzar la cuadrícula pero no mapa. Mientras que en otras carreras, simplemente falla.

A continuación se muestra mi código de actividad.

 package com.shawnbe.mallfinder; import java.util.List; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.OverlayItem; import android.content.Context; import android.graphics.drawable.Drawable; import android.location.Criteria; import android.location.Location; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class MallFinderActivity extends MapActivity implements android.location.LocationListener { /** Called when the activity is first created. */ private MapController mapController; private MapView mapView; private android.location.LocationManager locationManager; private GeoPoint currentPoint; private Location currentLocation = null; private TextView latituteField; private TextView longitudeField; private String bestProvider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView mapView = (MapView) findViewById(R.id.mapView); mapView.setBuiltInZoomControls(true); Location location; //getBestProvider(); if(bestProvider !=null) location = locationManager.getLastKnownLocation(bestProvider); List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable( R.drawable.androidmarker); MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable, this); LocalGeoPoints loc = new LocalGeoPoints(); for (OverlayItem a : loc.overlayitems) { itemizedoverlay.addOverlay(a); } mapOverlays.add(itemizedoverlay); } @Override protected void onResume() { super.onResume(); locationManager .requestLocationUpdates(getBestProvider(), 1000, 1, this); } public void getLastLocation() { String provider = getBestProvider(); currentLocation = locationManager.getLastKnownLocation(provider); if (currentLocation != null) { setCurrentLocation(currentLocation); } else { Toast.makeText(this, "Location not yet acquired", Toast.LENGTH_LONG) .show(); } } public void animateToCurrentLocation() { if (currentPoint != null) { mapController.animateTo(currentPoint); } } public String getBestProvider() { locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); criteria.setAccuracy(Criteria.NO_REQUIREMENT); bestProvider = locationManager.getBestProvider(criteria, false); return bestProvider; } public void setCurrentLocation(Location location) { int currLatitude = (int) (location.getLatitude() * 1E6); int currLongitude = (int) (location.getLongitude() * 1E6); currentPoint = new GeoPoint(currLatitude, currLongitude); currentLocation = new Location(""); currentLocation.setLatitude(currentPoint.getLatitudeE6() / 1e6); currentLocation.setLongitude(currentPoint.getLongitudeE6() / 1e6); } @Override protected boolean isRouteDisplayed() { return false; } /* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { int lat = (int) (location.getLatitude()); int lng = (int) (location.getLongitude()); latituteField.setText(String.valueOf(lat)); longitudeField.setText(String.valueOf(lng)); } @Override public void onProviderEnabled(String provider) { Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } 

Y abajo está mi ccomplete main.xml con la clave que obtuve del sitio google map registeration.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="0steid872FeGgae0eO2Dhdyei37sFPHG65t7N6XA"/> </FrameLayout> </LinearLayout> 

La imagen de abajo es todo lo que obtengo

12 Solutions collect form web for “Android googleMap Mapa no muestra, sólo la cuadrícula, a veces”

https://developers.google.com/maps/documentation/android/mapkey – información oficial, qué hacer.

Paso a paso.

1) Crear keystore

2) Generación de hash MD5 desde su almacén de claves

3) Inicia sesión aquí: https://developers.google.com/android/maps-api-signup

4) Añadir clave a su aplicación

¡Buena suerte!

En onCreate debe init el campo locationManager . Movimiento

 locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE); 

Cadena del método getBestProvider() a su onCreate ()

Mira tu stacktrace. Usted sólo tiene un lugar donde NPE potencialmente puede ocurrir

 . . . 08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException 08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61) 08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149) 

La razón por la que obtiene un NullPointer es que nunca establezca locationManager antes de usarlo en onResume() .

onCreate() se va a llamar donde tienes getBestProvider() comentado. A continuación, onResume() se llama y que utiliza locationManager. Aunque todavía tienes otra situación aún más complicada. Voy a ver si puedo caminar a través de procedurally qué código se ejecutará en onResume () …

  1. Super.onResume ()
  2. LocationManager.requestLocationUpdates () <- es probable que vaya a buscar este método y obtener un puntero nulo … continuaremos si locationManager no son nulos
  3. LocationManager = (android.location.LocationManager) getSystemService (Context.LOCATION_SERVICE); <- ahora está cambiando el objeto referenciado desde el paso 2 …

Si yo fuera tú, simplificaría las cosas, sólo establecería el locationManager en onCreate() (como una práctica de programación general que desea limitar el número de efectos secundarios en los métodos, lo que quiero decir es en getBestProvider() , sólo debe devolver el Mejor proveedor, y tratar de no hacer nada más a su estado, o usted obtiene locas cosas inesperadas fuera de ese método). Si usted todavía está consiguiendo un poco de locura, yo sólo pondría esa primera línea de getBestProvider() en onResume()

 protected void onResume() { super.onResume(); locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(getBestProvider(), 1000, 1, this); } 

Probablemente no quiera dejarlo así, pero se asegurará de que su problema sea que locationManager es null en onResume()

Buena suerte.

Si tiene una clave de mapa válida, compruebe si está recibiendo una instancia de locationManager en onResume supongo que tiene que instanciar el gestor de ubicación en onResume ().

  locationManager = (android.location.LocationManager)getSystemService(Context.LOCATION_SERVICE); 

Tendrá que centrar la vista del mapa y establecer un nivel de zoom razonable. De lo contrario, la vista de mapa puede mostrar algún área aleatoria.

 mapView.setCenter( new GeoPoint((int)(25.76032 * 1E6), (int)(-80.213928 * 1E6))); //Set a reasonable zoom level mapView.setZoom(12); 

NullPointerException es debido a que está accediendo a un objeto nulo de locationmanager.

Crear apk en el modo de liberación y ejecutar este archivo apk, porque google mapa se mostrará cuando apk en el modo de liberación.

Actualice su clave de API de Google Map, la clave de API anterior estaba caducada, por lo que en este caso no podrá ver Google Map. https://developers.google.com/android/maps-api-signup

Asegúrese de inicializarlo antes de usarlo.

 locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

Probabilly hay también un problema mapkey:

Si ejecuta la aplicación en modo de depuración para realizar pruebas, debe crear una mapkey utilizando el almacén de claves por defecto para depuración (por ejemplo en linux, puede encontrarlo en ~ / .android / debug.keystore) e inserte esta mapkey en código y use Hasta que depure la aplicación.

Si quieres crear un apk y ejecutarlo (por ejemplo, para publicar tu apk en el mercado), tienes que crear una nueva mapkey usando tu keystore personal, y cambiarlo de tu código antes para generar el apk

La API MAP requiere una clave válida para funcionar correctamente.

Para obtener la clave api para su aplicación, debe seguir los pasos que se indican a continuación.

  1. Genere la huella digital de certificación de su aplicación utilizando el comando keytool.

    Keytool -list -keystore ~ ​​/ .android / debug.keystore Ejemplo: 94: 1E: 43: 49: 87: 73: BB: E6: A6: 88: D7: 20: F1: 8E: B5: 98

  2. Utilizando el valor de huella digital, puede generar la clave api de mapa desde el enlace que se muestra a continuación

    https://developers.google.com/android/maps-api-signup

Nota:

  1. Cuando quiera liberar la aplicación, no se puede usar la misma clave de api de mapas. Debe utilizar el almacén de claves de liberación en lugar del almacén de claves de depuración (.android / debug.keystore). Genere la huella dactilar utilizando el comando dado anteriormente y úsela para generar la clave api de mapas para uso en producción.
  2. El keytool binario se puede encontrar en su carpeta jre bin del sistema.

C: \ Archivos de programa \ Java \ jdk1.7.0_06 \ jre \ bin

LocationManager es nulo, no hay discusión al respecto, ¿lo especificó en manifest.xml?

  • Actualizado una aplicación con v1 mapa en google jugar ahora mostrando azulejos en blanco
  • Cómo dibujar Polyline interactivo en la ruta google maps v2 android
  • Restringir resultados de autocompletar por setBoundsBias
  • Cómo corregir Google Maps "¿Ha fallado la autenticación en el servidor"?
  • ¿Cómo obtener todos los grandes almacenes presentes en una ciudad en Android con google lugares?
  • ¿Cómo hacer que el marcador aparezca en el centro de la ventana inicial de Google Map?
  • Android: para dibujar una ruta entre dos puntos geográficos
  • ¿Cómo establezco la ubicación predeterminada y el nivel de zoom para google map api v2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.