64

我正在尝试在 Google Maps Android API v2 中获取带有自定义图标的标记。我刚刚更改了 Google 提供的示例之一。我在方法中添加.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))到 RawMapViewDemoActivitysetUpMap().

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,这个类就会被正确初始化。

我做了第一个,但仍然收到此错误。有什么建议么?

4

7 回答 7

110

打电话MapsInitializer.initialize(getApplicationContext())onCreate()

于 2012-12-20T08:39:11.670 回答
23

调用以下onCreate()

try {
        MapsInitializer.initialize(getApplicationContext());
    } catch (GooglePlayServicesNotAvailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2013-07-26T12:46:36.807 回答
20

移动要调用的代码onMapReady(),由 GoogleMaps API 提供的回调。

于 2016-09-16T09:35:44.520 回答
1

这发生在我身上,最后在我的情况下,我发现没有安装谷歌播放服务。所以安装它们并且应用程序没有崩溃。所以可能有人可以在 catch 块中放入 try 和一个对话框。

于 2017-09-11T08:23:33.100 回答
0

请参阅带有矢量资产图标的 android 中谷歌地图中的自定义标记

就我而言,我在谷歌地图上有标记。但是在 API 19 模拟器上存在Google Play Services. 所以这个错误是误导,Google Play Services试图创建BitmapDescriptor,但不能。

您应该在 中创建标记onMapReady(),并将任何其他代码移到那里,使用Google Maps.

如果您在 Android 4 上显示 Google 地图时遇到问题,也许您应该将库从 16.1.0 降级到 16.0.0,请参阅https://stackoverflow.com/a/54772374/2914140。但如果你这样做,你会在 Androif 9 上崩溃,请参阅Google Maps 在 Android Pie 上崩溃

于 2019-05-07T13:33:57.813 回答
0

好的,这是一个对我有用的解决方案,我偶然发现了它!只需将您的 Gradle 升级到 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
}
于 2020-04-13T15:49:59.737 回答
-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 {}
于 2016-04-02T11:12:51.497 回答