2012-12-18 304 views
55

我试图在Google Maps Android API v2中使用自定义图标标记。我刚刚更改了Google提供的一个示例。我加.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))到RawMapViewDemoActivity的方法setUpMap().“IBitmapDescriptorFactory未初始化”错误

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

但我总是得到一个“IBitmapDescriptorFactory未初始化”。

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 

BitmapDescriptorFactory它说:

此前使用从这个类的任何方法,你必须做到以下几点,以确保这一类被初始化的一个:

  • 等待使GoogleMap可以从已添加到应用程序的MapFragment或MapView中获取。您可以通过调用getMap()方法并检查返回的对象是否为空来验证GoogleMap是否可用。

  • 调用MapsInitializer.initialize(Context)。只要不引发com.google.android.gms.common.GooglePlayServicesNotAvailableException GooglePlayServicesNotAvailableException,该类将被正确初始化。

我做的第一个,但仍然得到这个错误。有什么建议么?

+0

我建议创建一个示例项目,可以重现错误并将其源代码发布到某处。这感觉就像'fromResource()'中的一个错误,但我们需要一个可重复的测试用例。 – CommonsWare

+0

调用'MapInitializer.initialize()'对我来说是诀窍。 – Ash

+0

我面临同样的问题..java.lang.NullPointerException:IBitmapDescriptorFactory未初始化 – sanjay

回答

89

呼叫MapsInitializer.initialize(getApplicationContext())onCreate()

+0

@Greeny它会抛出异常 –

+6

这是一个很好的答案,然而它会很好地发现为什么真的发生在第一个地方,它没有记录在地图教程AFAIK – avalancha

+17

我的应用程序仍然崩溃在这个例外的一些手机,即使我已经添加了这一行代码。我发现它可能与未安装或最新的GooglePlay商店有关。任何方式来找出地图是否可用? –

20

呼叫在onCreate()

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

我收到一条消息,这个try catch块永远不会抛出异常? – 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

移动你的代码下面被称为 'onMapReady()',由谷歌地图API提供了回调。

它会工作!

+1

当我放入onCreate并在s5(和模拟器)中失败时,它在Galaxy s3上工作(当我在onCreate中创建MapsInitializer时)。移动到onMapReady帮助,欢呼! –

+1

这实际上是正确的答案。其他解决方案不适用于所有手机。 –

1

这发生在我身上,最后在我的情况下,我能找到的是谷歌播放服务没有安装。所以安装它们和应用程序没有崩溃。所以可能是一个可以把尝试和对话在catch块中这样说。