2012-12-18 15 views
55

Sto cercando di ottenere un indicatore con un'icona personalizzata nell'API di Google Maps per Android v2. Ho appena modificato uno degli esempi forniti da Google. Ho aggiunto .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)) a RawMapViewDemoActivity nel metodo setUpMap().Errore "IBitmapDescriptorFactory non inizializzato"

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))); 
} 

Ma sto ottenendo sempre un "IBitmapDescriptorFactory non è inizializzata".

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 

In BitmapDescriptorFactory si dice:

Prima di utilizzare i metodi di questa classe, è necessario effettuare una delle seguenti operazioni per garantire che questa classe viene inizializzato:

  • Wait affinché GoogleMap diventi disponibile da MapFragment o MapView che hai aggiunto alla tua applicazione. Puoi verificare che GoogleMap sia disponibile chiamando il metodo getMap() e controllando che l'oggetto restituito non sia nullo.

  • Chiama MapsInitializer.initialize (contesto). Finché non viene generata una com.google.android.gms.common.GooglePlayServicesNotAvailableException GooglePlayServicesNotAvailableException, questa classe verrà inizializzata correttamente.

ho fatto il primo, ma ancora ottenere questo errore. Eventuali suggerimenti?

+0

Suggerisco di creare un progetto di esempio in grado di riprodurre l'errore e di postare il suo codice sorgente da qualche parte. Questo sembra un bug in 'fromResource()', ma avremmo bisogno di un caso di test riproducibile. – CommonsWare

+0

Chiamare 'MapInitializer.initialize()' fa il trucco per me. – Ash

+0

sto affrontando lo stesso problema..java.lang.NullPointerException: IBitmapDescriptorFactory non è inizializzato – sanjay

risposta

89

Chiamata MapsInitializer.initialize(getApplicationContext()) nel onCreate()

+0

@Greeny Genera un'eccezione –

+6

Questo è una buona risposta, tuttavia sarebbe bello scoprire il motivo per cui ciò accade in primo luogo, non è documentato nel tutorial delle mappe AFAIK – avalancha

+17

La mia applicazione si blocca ancora su alcuni telefoni con questa eccezione anche se ho aggiunto questa riga di codice.Ho scoperto che potrebbe avere qualcosa da fare con GooglePlay store non installato o aggiornato. Qualche modo per scoprire se Maps è disponibile? –

20

chiamata seguendo onCreate()

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

Ricevo un messaggio, l'eccezione non viene mai lanciata in questo blocco catch try? – Apqu

-1
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 {} 
9

spostare il codice per essere chiamato 'onMapReady()', un callback fornita dalle API GoogleMaps.

Funzionerà!

+1

Ha funzionato (quando trigger MapsInitializer in onCreate) su Galaxy s3 quando ho inserito in onCreate e fallito in s5 (ed emulatore). Passato a onMapReady aiutato, evviva! –

+1

Questa è in realtà la risposta giusta. Altre soluzioni non funzionano su tutti i cellulari. –

1

Questo è successo a me e, infine, nel mio caso quello che ho potuto trovare era che i servizi di Google Play non sono stati installati. Quindi li ho installati e l'app non si è bloccata. Così può essere uno può mettere provare e una finestra di dialogo dicendo così nel blocco catch.

Problemi correlati