IllegalArgumentException:使用gms.maps.model.Marker.setIcon的非托管描述符 [英] IllegalArgumentException: Unmanaged descriptor using gms.maps.model.Marker.setIcon

查看:839
本文介绍了IllegalArgumentException:使用gms.maps.model.Marker.setIcon的非托管描述符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一款使用



某些项目配置




  • 我使用自定义渲染( SucursalRender扩展了DefaultClusterRenderer< Sucursal>

  • 我使用Glide像前面说过的那样下载标记图标: Glide.with(context).load(id).fitCenter()。placeholder(R.drawable.ic_no_image) .into(simpleTarget);



simpleTarget 是我处理为Glide下载/缓存的图像的地方。我发布了所有关于 simpleTarget 的代码,因为崩溃已经从那里开始:

 私人类CustomSimpleTarget扩展SimpleTarget< GlideDrawable> {
Sucursal sucursal;
标记markerToChange = null;
$ b @Override
public void onResourceReady(GlideDrawable资源,GlideAnimation< ;? super GlideDrawable> glideAnimation){
mImageView.setImageDrawable(resource);
// currentSelectedItem是在地图中选择的当前元素(Sucursal类型)
// mIconGenerator是a:CustomIconGenerator扩展IconGenerator
if(currentSelectedItem!= null&& sucursal.idalmacen。 contentEquals(currentSelectedItem.idalmacen))
mIconGenerator.customIconBackground.useSelectionColor(true,ContextCompat.getColor(mContext,R.color.colorAccent));
else
mIconGenerator.customIconBackground.useSelectionColor(false,0);

位图图标= mIconGenerator.makeIcon(); (标记标记:mClusterManager.getMarkerCollection()。getMarkers()){
if(marker.getPosition()。equals())返回

if(markerToChange == null){
sucursal.getPosition())){
markerToChange = marker;



$ b // if if found - change icon
if(markerToChange!= null){
// GlideShortcutDrawable is WeakReference<>(可绘制)
sucursal.setGlideShortCutDrawable(resource);
markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));





崩溃正在抛出最后一行代码: markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));




我尝试/发现试图理解/修正它


  • 试图在4个真实设备中重现错误,但没有成功。
  • 在web中搜索有关类似错误或代码 gms.maps.model.Marker.setIcon com.google.maps.api.android.lib6

  • 试图了解给定的混淆代码Android Studio for Marker.setIcon



我想我可以包装在 try-catch块中的代码为IllegalArgumentException:非托管描述符,以避免应用程序因为崩溃而关闭,但它只是一个解决方案。



更新2

DefaultClusterRenderer :

  public class SucursalRender extends DefaultClusterRenderer< Sucursal> {
/ **
*为两种背景颜色的标记创建一个自定义图标。与{@link com.google.maps.android.clustering.ClusterItem}一起使用。
* /
private final CustomIconGenerator mIconGenerator;
/ **
*标记图像。
* /
private final ImageView mImageView;
/ **
*使用单一背景为{@link Cluster< Sucursal>}创建自定义图标。
* /
private final IconGenerator mClusterIconGenerator;
/ **
*集群映像。
* /
private final ImageView mClusterImageView;
private final Context mContext;
/ **
*保留对UI中突出显示的当前项目的引用(具有不同背景的项目)。
* /
public Sucursal currentSelectedItem;
/ **
* {@ ClusterManager< Sucursal>}实例。
* /
private ClusterManager< Sucursal> mClusterManager;
$ b $ public SucursalRender(Context context,GoogleMap map,ClusterManager< Sucursal> clusterManager){
super(context,map,clusterManager);

mContext = context;
mClusterManager = clusterManager;
mIconGenerator = new CustomIconGenerator(mContext.getApplicationContext());
mClusterIconGenerator = new IconGenerator(mContext.getApplicationContext());

int padding =(int)mContext.getResources()。getDimension(R.dimen.custom_profile_padding);
int dimension =(int)mContext.getResources()。getDimension(R.dimen.custom_profile_image);

//R.layout.map_cluster_layout是一个简单的XML,带有用于标记和聚类的可视元素
View view =((AppCompatActivity)mContext).getLayoutInflater()。inflate(R .layout.map_cluster_layout,null);
mClusterIconGenerator.setContentView(view);
mClusterImageView =(ImageView)view.findViewById(R.id.image);
mClusterImageView.setPadding(padding,padding,padding,padding);

mImageView = new ImageView(mContext.getApplicationContext());
mImageView.setLayoutParams(new ViewGroup.LayoutParams(dimension,dimension));
mImageView.setPadding(padding,padding,padding,padding);
mIconGenerator.setContentView(mImageView);

CustomIconBackground customIconBackground = new CustomIconBackground(false);
mIconGenerator.setBackground(customIconBackground);
mIconGenerator.customIconBackground = customIconBackground;
mClusterIconGenerator.setBackground(new CustomIconBackground(true));
}

...

@Override
保护无效onBeforeClusterItemRendered(最终Sucursal sucursal,MarkerOptions markerOptions){

mImageView.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.ic_no_image));
位图图标= mIconGenerator.makeIcon();
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));

$ b @Override
protected void onClusterItemRendered(Sucursal clusterItem,Marker marker){
CustomSimpleTarget simpleTarget = new CustomSimpleTarget();
simpleTarget.sucursal = clusterItem;
simpleTarget.markerToChange = marker;
ImageLoaderManager.setImageFromId(simpleTarget,clusterItem.logo,mContext);

$ b @Override
protected void onBeforeClusterRendered(Cluster< Sucursal> cluster,MarkerOptions markerOptions){
mClusterImageView.setImageDrawable(ResourcesCompat.getDrawable(mContext.getResources() ,R.drawable.ic_sucursales,null));
位图图标= mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}

@Override
protected boolean shouldRenderAsCluster(Cluster cluster){
//总是渲染集群。
return cluster.getSize()> 1;
}

/ **
*只需扩展{@link IconGenerator}并赋予改变背景的能力。
*用于知道突出显示UI中当前选定的项目。
* /
私有类CustomIconGenerator扩展IconGenerator {
私有CustomIconBackground customIconBackground;
private CustomIconGenerator(Context context){
super(context);
}
}


/ **
*创建一个自定义图标以与{@link Marker}或{@link Cluster< Sucursal> }
* /
私人类CustomIconBackground扩展可绘制{

private final Drawable mShadow;
私人最终可绘制mMask;
private int mColor = Color.WHITE;

private boolean useSelectionColor;
private int mColorSelection;

private CustomIconBackground(boolean isCluster){
useSelectionColor = false;

if(isCluster){
mMask = ContextCompat.getDrawable(mContext,R.drawable.map_pin_negro_cluster);
mShadow = ContextCompat.getDrawable(mContext,R.drawable.map_pin_transparente_cluster);
}
else {
mMask = ContextCompat.getDrawable(mContext,R.drawable.map_pin_negro);
mShadow = ContextCompat.getDrawable(mContext,R.drawable.map_pin_transparente);
}
}

public void setColor(int color){
mColor = color;
}

private void useSelectionColor(boolean value,int color){
useSelectionColor = value;
mColorSelection = color;
}
@Override
public void draw(@NonNull Canvas canvas){
mMask.draw(canvas);
canvas.drawColor(mColor,PorterDuff.Mode.SRC_IN);
mShadow.draw(canvas);

if(useSelectionColor){
canvas.drawColor(mColorSelection,PorterDuff.Mode.SRC_IN);
useSelectionColor = false;
}
}

@Override
public void setAlpha(int alpha){
throw new UnsupportedOperationException();
}

@Override
public void setColorFilter(ColorFilter cf){
throw new UnsupportedOperationException();
}

@Override
public int getOpacity(){
return PixelFormat.TRANSLUCENT;
}

@Override
public void setBounds(int left,int top,int right,int bottom){
mMask.setBounds(left,top,right,底部);
mShadow.setBounds(左,上,右,下);
}

@Override
public void setBounds(@NonNull Rect bounds){
mMask.setBounds(bounds);
mShadow.setBounds(bounds);
}

@Override
public boolean getPadding(@NonNull Rect padding){
return mMask.getPadding(padding);


ImageLoaderManager 就是Glide的Facade。

  public static void setImageFromId(SimpleTarget< GlideDrawable> simpleTarget,String id,Context上下文){

if(context instanceof AppCompatActivity){
AppCompatActivity activity =(AppCompatActivity)context;
if(activity.isDestroyed())
return;
}
Glide.with(context)
.load(id)
.fitCenter()
.placeholder(R.drawable.ic_no_image)
。成(simpleTarget);
}


解决方案

并用try / catch设置沉默异常不会解决,因为用户无法在我的情况下看到当前位置:


java。 lang.IllegalArgumentException:非托管描述符
,位于com.google.maps.api.android.lib6.common.kb(:com.google.android.gms.DynamiteModulesB:162)
位于com.google.maps .api.android.lib6.impl.oc(:com.google.android.gms.DynamiteModulesB:75)
,位于com.google.maps.api.android.lib6.impl.db.a(:com。 google.android.gms.DynamiteModulesB:334)
,位于com.google.android.gms.maps.model.internal.q.onTransact(:com.google.android.gms.DynamiteModulesB:204)
at android.os.Binder.transact(Binder.java:361)
at com.google.android.gms.maps.model.internal.zzf $ zza $ zza.zzL(Unknown
Source)
在com.google.android.gms.maps.model.Marker.setIcon(未知来源)


blockquote>

我在做什么:



按住home按钮以最小化地图片段屏幕,然后从启动器启动应用程序。



正在执行的代码: marker不为空,位置不为null set location and icon。

  if(markerCurrentLocation == null&& google map!= null){
markerCurrentLocation = googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0.0,0.0))
.icon(null));
markerCurrentLocation.setTag(-101); (标记当前位置!=空&&位置!=空){
markerCurrentLocation.setPosition(new LatLng(location.getLatitude(),location.getLongitude(


) )));
if(ORDER_STARTED){
markerCurrentLocation.setIcon(CURRENT_MARKER_ORANGE);
} else {
markerCurrentLocation.setIcon(CURRENT_MARKER_GRAY);


$ / code $ / pre
$ b $异常在:markerCurrentLocation.setIcon();



我如何摆脱此异常:



/ p>

  if(markerCurrentLocation == null&& googleMap!= null)

这意味着我再次初始化标记。
如果遇到这个错误,尽量不要在老标记上设置setIcon(),而是要膨胀新标记,然后使用setIcon()。

解释:

我假设异常原因是如果代码试图在已经设置了它的标记上再次尝试setIcon(),那么在特定的实例就像在我的情况下,地图正在恢复,或者可能在你的情况下,标记从地图的可见部分出来并进入或类似。



肯定没有问题我们从方法BitmapDescriptorFactory.fromBitmap()或
BitmapDescriptorFactory.fromResource()获取描述符。
作为异常提示,描述符在旧标记上不受管理,更好使用新标记。

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 gms.maps.model.Marker.setIcon is private, so I'm asking for some help with this problem.
The follow part of the question is divided into:

  • What the user was doing
  • What firebase crash reported to me
  • Some project configs
  • What I tried/found trying to understand/fix it

What the user was doing
He was zooming in and out in a map (Fragment that uses com.google.android.gms.maps.SupportMapFragment)

What firebase crash reported to me

Exception java.lang.IllegalArgumentException: Unmanaged descriptor
com.google.maps.api.android.lib6.common.k.b (:com.google.android.gms.DynamiteModulesB:162)
com.google.maps.api.android.lib6.impl.o.c (:com.google.android.gms.DynamiteModulesB:75)
com.google.maps.api.android.lib6.impl.db.a (:com.google.android.gms.DynamiteModulesB:334)
com.google.android.gms.maps.model.internal.q.onTransact (:com.google.android.gms.DynamiteModulesB:204)
android.os.Binder.transact (Binder.java:387)
com.google.android.gms.maps.model.internal.zzf$zza$zza.zzL () com.google.android.gms.maps.model.Marker.setIcon ()
co.com.spyspot.ui.content.sucursal.SucursalRender$CustomSimpleTarget.onResourceReady (SucursalRender.java:156)
co.com.spyspot.ui.content.sucursal.SucursalRender$CustomSimpleTarget.onResourceReady (SucursalRender.java:130)
com.bumptech.glide.request.GenericRequest.onResourceReady (GenericRequest.java:525)
com.bumptech.glide.request.GenericRequest.onResourceReady (GenericRequest.java:507)
com.bumptech.glide.load.engine.EngineJob.handleResultOnMainThread (EngineJob.java:158)
com.bumptech.glide.load.engine.EngineJob.access$100 (EngineJob.java:22)
com.bumptech.glide.load.engine.EngineJob$MainThreadCallback.handleMessage (EngineJob.java:202)
android.os.Handler.dispatchMessage (Handler.java:98)
android.os.Looper.loop (Looper.java:148)
android.app.ActivityThread.main (ActivityThread.java:5443)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:728)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

And:


Some project configs

  • I'm using a Custom Render (SucursalRender extends DefaultClusterRenderer<Sucursal>)
  • I'm downloading the Marker icon with Glide like I said before: Glide.with(context).load(id).fitCenter().placeholder(R.drawable.ic_no_image).into(simpleTarget);

The simpleTarget is where I handle the images downloaded/cached for Glide. I'm posting all code about simpleTarget because the crash is starting there:

private class CustomSimpleTarget extends SimpleTarget<GlideDrawable> {
    Sucursal sucursal;
    Marker markerToChange = null;

    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
        mImageView.setImageDrawable(resource);
        //currentSelectedItem is the current element selected in the map (Sucursal type)
        //mIconGenerator is a: CustomIconGenerator extends IconGenerator
        if (currentSelectedItem != null && sucursal.idalmacen.contentEquals(currentSelectedItem.idalmacen))
            mIconGenerator.customIconBackground.useSelectionColor(true, ContextCompat.getColor(mContext, R.color.colorAccent));
        else
            mIconGenerator.customIconBackground.useSelectionColor(false, 0);

        Bitmap icon = mIconGenerator.makeIcon();

        if (markerToChange == null) {
            for (Marker marker : mClusterManager.getMarkerCollection().getMarkers()) {
                if (marker.getPosition().equals(sucursal.getPosition())) {
                    markerToChange = marker;
                }
            }
        }

        // if found - change icon
        if (markerToChange != null) {
            //GlideShortcutDrawable is a WeakReference<>(drawable)
            sucursal.setGlideShortCutDrawable(resource);
            markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
        }
    }
}

The crash is being thrown in last line of code: markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));

What I tried/found trying to understand/fix it

  • Tried to reproduce the error in 4 real devices without success.
  • Searched in web for similar errors or code about gms.maps.model.Marker.setIcon or com.google.maps.api.android.lib6
  • Tried to understand the obfuscated code given in Android Studio for Marker.setIcon

I guess I can wrap the code in a try-catch block for that IllegalArgumentException: Unmanaged descriptor to avoid application get closed because the crash but it's just a work around it.

update 2
The code of DefaultClusterRenderer:

public class SucursalRender extends DefaultClusterRenderer<Sucursal> {
    /**
     * Create a customized icon for markers with two background colors. Used with {@link com.google.maps.android.clustering.ClusterItem}.
     */
    private final CustomIconGenerator mIconGenerator;
    /**
     * Marker image.
     */
    private final ImageView mImageView;
    /**
     * Create a customized icon for {@link Cluster<Sucursal>} with a single background.
     */
    private final IconGenerator mClusterIconGenerator;
    /**
     * Cluster image.
     */
    private final ImageView mClusterImageView;
    private final Context mContext;
    /**
     * Keep a reference to the current item highlighted in UI (the one with different background).
     */
    public Sucursal currentSelectedItem;
    /**
     * The {@link ClusterManager<Sucursal>} instance.
     */
    private ClusterManager<Sucursal> mClusterManager;

    public SucursalRender(Context context, GoogleMap map, ClusterManager<Sucursal> clusterManager) {
        super(context, map, clusterManager);

        mContext = context;
        mClusterManager = clusterManager;
        mIconGenerator = new CustomIconGenerator(mContext.getApplicationContext());
        mClusterIconGenerator = new IconGenerator(mContext.getApplicationContext());

        int padding = (int) mContext.getResources().getDimension(R.dimen.custom_profile_padding);
        int dimension = (int) mContext.getResources().getDimension(R.dimen.custom_profile_image);

        //R.layout.map_cluster_layout is a simple XML with the visual elements to use in markers and cluster
        View view = ((AppCompatActivity)mContext).getLayoutInflater().inflate(R.layout.map_cluster_layout, null);
        mClusterIconGenerator.setContentView(view);
        mClusterImageView = (ImageView) view.findViewById(R.id.image);
        mClusterImageView.setPadding(padding, padding, padding, padding);

        mImageView = new ImageView(mContext.getApplicationContext());
        mImageView.setLayoutParams(new ViewGroup.LayoutParams(dimension, dimension));
        mImageView.setPadding(padding, padding, padding, padding);
        mIconGenerator.setContentView(mImageView);

        CustomIconBackground customIconBackground = new CustomIconBackground(false);
        mIconGenerator.setBackground(customIconBackground);
        mIconGenerator.customIconBackground = customIconBackground;
        mClusterIconGenerator.setBackground(new CustomIconBackground(true));
    }

    ...

    @Override
    protected void onBeforeClusterItemRendered(final Sucursal sucursal, MarkerOptions markerOptions) {

        mImageView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_no_image));
        Bitmap icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected void onClusterItemRendered(Sucursal clusterItem, Marker marker) {
        CustomSimpleTarget simpleTarget = new CustomSimpleTarget();
        simpleTarget.sucursal = clusterItem;
        simpleTarget.markerToChange = marker;
        ImageLoaderManager.setImageFromId(simpleTarget, clusterItem.logo, mContext);
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<Sucursal> cluster, MarkerOptions markerOptions) {
        mClusterImageView.setImageDrawable(ResourcesCompat.getDrawable(mContext.getResources(), R.drawable.ic_sucursales, null));
        Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }

    /**
     * Just extends {@link IconGenerator} and give the ability to change background.
     * Used to know highlight the current selected item in UI.
     */
    private class CustomIconGenerator extends IconGenerator {
        private CustomIconBackground customIconBackground;
        private CustomIconGenerator(Context context) {
            super(context);
        }
    }


    /**
     * Create a custom icon to use with {@link Marker} or {@link Cluster<Sucursal>}
     */
    private class CustomIconBackground  extends Drawable {

        private final Drawable mShadow;
        private final Drawable mMask;
        private int mColor = Color.WHITE;

        private boolean useSelectionColor;
        private int mColorSelection;

        private CustomIconBackground(boolean isCluster) {
            useSelectionColor = false;

            if (isCluster) {
                mMask = ContextCompat.getDrawable(mContext, R.drawable.map_pin_negro_cluster);
                mShadow = ContextCompat.getDrawable(mContext, R.drawable.map_pin_transparente_cluster);
            }
            else {
                mMask = ContextCompat.getDrawable(mContext, R.drawable.map_pin_negro);
                mShadow = ContextCompat.getDrawable(mContext, R.drawable.map_pin_transparente);
            }
        }

        public void setColor(int color) {
            mColor = color;
        }

        private void useSelectionColor(boolean value, int color) {
            useSelectionColor = value;
            mColorSelection = color;
        }
        @Override
        public void draw(@NonNull Canvas canvas) {
            mMask.draw(canvas);
            canvas.drawColor(mColor, PorterDuff.Mode.SRC_IN);
            mShadow.draw(canvas);

            if (useSelectionColor) {
                canvas.drawColor(mColorSelection, PorterDuff.Mode.SRC_IN);
                useSelectionColor = false;
            }
        }

        @Override
        public void setAlpha(int alpha) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            throw new UnsupportedOperationException();
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

        @Override
        public void setBounds(int left, int top, int right, int bottom) {
            mMask.setBounds(left, top, right, bottom);
            mShadow.setBounds(left, top, right, bottom);
        }

        @Override
        public void setBounds(@NonNull Rect bounds) {
            mMask.setBounds(bounds);
            mShadow.setBounds(bounds);
        }

        @Override
        public boolean getPadding(@NonNull Rect padding) {
            return mMask.getPadding(padding);
        }
    }

The ImageLoaderManager is just a Facade for Glide.

public static void setImageFromId(SimpleTarget<GlideDrawable> simpleTarget, String id, Context context) {

    if (context instanceof AppCompatActivity) {
        AppCompatActivity activity = (AppCompatActivity)context;
        if (activity.isDestroyed())
            return;
    }
    Glide.with(context)
            .load(id)
            .fitCenter()
            .placeholder(R.drawable.ic_no_image)
            .into(simpleTarget);
}

解决方案

I was too getting same exception and setting silent exception with try/catch would not have been solution as user is not able to see current location in my case:

java.lang.IllegalArgumentException: Unmanaged descriptor at com.google.maps.api.android.lib6.common.k.b(:com.google.android.gms.DynamiteModulesB:162) at com.google.maps.api.android.lib6.impl.o.c(:com.google.android.gms.DynamiteModulesB:75) at com.google.maps.api.android.lib6.impl.db.a(:com.google.android.gms.DynamiteModulesB:334) at com.google.android.gms.maps.model.internal.q.onTransact(:com.google.android.gms.DynamiteModulesB:204) at android.os.Binder.transact(Binder.java:361) at com.google.android.gms.maps.model.internal.zzf$zza$zza.zzL(Unknown Source) at com.google.android.gms.maps.model.Marker.setIcon(Unknown Source)

What I was doing :

Minimize the map fragment screen by pressing home button and then starting app from launcher.

What code was doing:

Checking is marker is not null and location is not null set location and icon.

     if (markerCurrentLocation == null && googleMap != null) {
            markerCurrentLocation = googleMap.addMarker(new MarkerOptions()
                    .position(new LatLng(0.0, 0.0))
                    .icon(null));
            markerCurrentLocation.setTag(-101);
       }

         if (markerCurrentLocation != null && location != null) {
                markerCurrentLocation.setPosition(new LatLng(location.getLatitude(), location.getLongitude()));
                if (ORDER_STARTED) {
                   markerCurrentLocation.setIcon(CURRENT_MARKER_ORANGE);
                } else {
                    markerCurrentLocation.setIcon(CURRENT_MARKER_GRAY);
                }       
         }

Exception was at : markerCurrentLocation.setIcon();

How I got rid of this exception:

I removed the following line

 if (markerCurrentLocation == null && googleMap != null) 

Which means I am initializing marker again. If you encounter this error, try not to setIcon() on old marker, instead inflate new marker and then use setIcon().

Explanation:

I ASSUME (not sure) exception reason was if code is trying to setIcon() again on marker on which it is already set , at particular instance like in my case Map is resuming or may be in your case marker goes out of visible part of map and comes in or something similar.

For sure there is no problem with descriptor we get from method BitmapDescriptorFactory.fromBitmap() or BitmapDescriptorFactory.fromResource(). As the exception hints, descriptor got unmanaged on a old marker, better use new one.

这篇关于IllegalArgumentException:使用gms.maps.model.Marker.setIcon的非托管描述符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆