"IBitmapDescriptorFactory is not initialized" error

AndroidGoogle Maps-Android-Api-2

Android Problem Overview


I'm trying to get a marker with an custom icon in Google Maps Android API v2. I just changed one of the examples Google provides. I added .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)) to RawMapViewDemoActivity in method 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)));
}

But I'm always getting an "IBitmapDescriptorFactory is not initialized".

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 it says:

>Prior to using any methods from this class, you must do one of the following to ensure that this class is initialized: > >- Wait for a GoogleMap to become available from a MapFragment or MapView that you have added to your application. You can verify that the GoogleMap is available by calling the getMap() method and checking that the returned object is not null. > >- Call MapsInitializer.initialize(Context). As long as a com.google.android.gms.common.GooglePlayServicesNotAvailableException GooglePlayServicesNotAvailableException isn't thrown, this class will be correctly initialized.

I did the first one, but still getting this error. Any suggestions?

Android Solutions


Solution 1 - Android

Call MapsInitializer.initialize(getApplicationContext()) in the onCreate()

Solution 2 - Android

Call following in onCreate()

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

Solution 3 - Android

Move your code to be called onMapReady(), a callback provided by the GoogleMaps API.

Solution 4 - Android

This happened to me and finally In my case what I could find was the google play services were not installed. So installed them and app did not crash. So may be one can put try and a dialog saying so in the catch block.

Solution 5 - Android

See https://stackoverflow.com/questions/42365658/custom-marker-in-google-maps-in-android-with-vector-asset-icon.

In my case I had markers over Google Maps. But on API 19 emulator there is a problem with Google Play Services. So this error is misleading, Google Play Services tried to create BitmapDescriptor, but could not.

You should create markers in onMapReady(), also move there any other code, working with Google Maps.

If you have problems with showing Google Maps on Android 4, maybe you should downgrade a library from 16.1.0 to 16.0.0, see https://stackoverflow.com/a/54772374/2914140. But if you do so, you will get a crash on Androif 9, see https://stackoverflow.com/questions/52139199/google-maps-crashing-on-android-pie/52139307.

Solution 6 - Android

Ok here is a solution that's work for me, i found it accidentally ! just upgrade your Gradle to com.android.tools.build:gradle:3.6.2

    dependencies {
    classpath 'com.android.tools.build:gradle:3.6.2'
    

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

Solution 7 - Android

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKrisView Question on Stackoverflow
Solution 1 - AndroidGreenyView Answer on Stackoverflow
Solution 2 - AndroidPratik ButaniView Answer on Stackoverflow
Solution 3 - AndroidCharlieView Answer on Stackoverflow
Solution 4 - AndroidShreyas KavathekarView Answer on Stackoverflow
Solution 5 - AndroidCoolMindView Answer on Stackoverflow
Solution 6 - AndroidMubashir MurtazaView Answer on Stackoverflow
Solution 7 - AndroidDmarpView Answer on Stackoverflow