IllegalArgumentException: Unmanaged descriptor using gms.maps.model.Marker.setIcon

后端 未结 10 2036
眼角桃花
眼角桃花 2020-12-14 05:39

I have an app that use android-maps-utils and glide for marker icons.
I got an error report using Firebase crash reporting which I can\'t track in source code because

相关标签:
10条回答
  • 2020-12-14 05:52

    Make sure the icon that you are using for marker should not be vector,it should be .png image.

    0 讨论(0)
  • 2020-12-14 05:53

    This exception happens when your marker was reclustered by ClusterManager. ClusterManager recreates marker on clustering. So, to avoid it you must get your marker from render of ClusterManeger:

    ClusterIconRender render = (ClusterIconRender) mClusterManager.getRenderer();
    Marker trueMarker = render.getMarker(clusterMarker);
    if (trueMarker != null) {
        trueMarker.setIcon(...);
        ... // do whatever else your want with marker
    }
    

    In code above ClusterMarker implements ClusterItem and ClusterIconRender extends DefaultClusterRenderer.

    0 讨论(0)
  • 2020-12-14 05:56

    I found this happening when accessing marker after it was removed. Interacting with marker in callback is exactly that case. As mentioned in Map's API:

    After a marker has been removed, the behavior of all its methods is undefined. https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#remove()

    Best option would be checking is marker removed from map or not.
    But we don't have such API. And I found another workaround, we can use Marker's setTag and getTag. Tag is set to null, when marker is removed:

    Google Maps Android API neither reads nor writes this property, except that when a marker is removed from the map, this property is set to null. https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#setTag(java.lang.Object)

    When creating marker use some tag for it.
    When updating marker check tag is not null.

    This could help in your case.

    @Override
    protected void onClusterItemRendered(Sucursal clusterItem, Marker marker) {
        // we don't care about tag's type so don't reset original one
        if (marker.getTag() == null) {
            marker.setTag("anything");
        }
        CustomSimpleTarget simpleTarget = new CustomSimpleTarget();
        simpleTarget.sucursal = clusterItem;
        simpleTarget.markerToChange = marker;
        ImageLoaderManager.setImageFromId(simpleTarget, clusterItem.logo, mContext);
    }
    

    And in callback

    private class CustomSimpleTarget extends SimpleTarget<GlideDrawable> {
        ...
    
        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
            ...
    
            // if found - change icon
            if (markerToChange != null) {
                //GlideShortcutDrawable is a WeakReference<>(drawable)
                sucursal.setGlideShortCutDrawable(resource);
                if (markerToChange.getTag != null) {
                    markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-14 06:04

    I fixed it by calling the following method.

    clusterManager.clearItems()
    

    After that, you can set bitmap to the markers.

    0 讨论(0)
  • 2020-12-14 06:04

    Marker centerPoint

    when you do that: centerPoint.remove();

    And then you do it again :

    marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));

    It throws an error :

    Unmanaged descriptor

    You should centerPoint.remove(); centerPoint=null;

    0 讨论(0)
  • 2020-12-14 06:05

    Try

    mClusterManager.markerCollection.clear();
    mMap.clear()
    
    0 讨论(0)
提交回复
热议问题