Erreur «IBitmapDescriptorFactory n’est pas initialisé»

J’essaie d’obtenir un marqueur avec une icône personnalisée dans Google Maps Android API v2. Je viens de changer l’un des exemples fournis par Google. J’ai ajouté .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)) à RawMapViewDemoActivity dans la méthode setUpMap().

 private void setUpMapIfNeeded() { if (mMap == null) { mMap = ((MapView) findViewById(R.id.map)).getMap(); if (mMap != null) { setUpMap(); } } } private void setUpMap() { mMap.addMarker(new MarkerOptions() .position(new LatLng(0, 0)) .title("Marker") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))); } 

Mais j’obtiens toujours un “IBitmapDescriptorFactory n’est pas initialisé”.

 12-18 15:40:54.356: E/AndroidRuntime(12591): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapdemo/com.example.mapdemo.RawMapViewDemoActivity}: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.access$600(ActivityThread.java:130) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.os.Handler.dispatchMessage(Handler.java:99) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.os.Looper.loop(Looper.java:137) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.main(ActivityThread.java:4745) 12-18 15:40:54.356: E/AndroidRuntime(12591): at java.lang.reflect.Method.invokeNative(Native Method) 12-18 15:40:54.356: E/AndroidRuntime(12591): at java.lang.reflect.Method.invoke(Method.java:511) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 12-18 15:40:54.356: E/AndroidRuntime(12591): at dalvik.system.NativeStart.main(Native Method) 12-18 15:40:54.356: E/AndroidRuntime(12591): Caused by: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.internal.at.a(Unknown Source) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.maps.model.BitmapDescriptorFactory.d(Unknown Source) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromResource(Unknown Source) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.setUpMap(RawMapViewDemoActivity.java:67) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.setUpMapIfNeeded(RawMapViewDemoActivity.java:58) 12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.onCreate(RawMapViewDemoActivity.java:43) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.Activity.performCreate(Activity.java:5008) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 12-18 15:40:54.356: E/AndroidRuntime(12591): ... 11 more 

Dans BitmapDescriptorFactory, il est écrit:

Avant d’utiliser des méthodes de cette classe, vous devez effectuer l’une des opérations suivantes pour vous assurer que cette classe est initialisée:

  • Attendez qu’un GoogleMap soit disponible depuis un MapFragment ou un MapView que vous avez ajouté à votre application. Vous pouvez vérifier que GoogleMap est disponible en appelant la méthode getMap () et en vérifiant que l’object renvoyé n’est pas nul.

  • Appelez MapsInitializer.initialize (contexte). Tant que com.google.android.gms.common.GooglePlayServicesNotAvailableException GooglePlayServicesNotAvailableException n’est pas lancé, cette classe sera correctement initialisée.

J’ai fait le premier, mais j’ai toujours cette erreur. Aucune suggestion?

Appelez MapsInitializer.initialize(getApplicationContext()) dans onCreate()

Appel suivant dans onCreate()

 try { MapsInitializer.initialize(getApplicationContext()); } catch (GooglePlayServicesNotAvailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Déplacez votre code pour qu’il s’appelle ‘onMapReady ()’, un rappel fourni par l’API GoogleMaps.

Ça va marcher!

Cela m’est arrivé et finalement, dans mon cas, ce que je pouvais trouver, c’était que les services Google Play n’étaient pas installés. Alors installé et l’application n’a pas planté. On peut donc essayer et créer une boîte de dialog pour le dire dans le bloc catch.

  GoogleApiAvailability googleApiAvailability=GoogleApiAvailability.getInstance(); int status=googleApiAvailability.isGooglePlayServicesAvailable(getActivity()); if (status != ConnectionResult.SUCCESS) { int requestCode = 10; Dialog dialog = googleApiAvailability.getErrorDialog(getActivity(),status,requestCode); dialog.show(); }else {}