Пользовательские маркеры, показывающие белый цвет на некоторых устройствах (Google Maps v3 Android SDK)

У меня есть SDK Google Maps с пользовательскими маркерами в приложении для Android. На наших тестовых телефонах все отлично работает – A7000, Samsung и другие. Однако, когда я запускаю приложение на устройствах Nexus 5 или LG, один тип пользовательского маркера отображает белый на карте.

Пока маркеры показывают белый цвет, они будут выполнять желаемое поведение.

Мы очень смущены этим, особенно потому, что другой пользовательский маркер (который очень похож) отлично работает. Помимо аппаратного обеспечения, единственная разница между нашими тестовыми телефонами и Nexus 5 заключается в том, что Nexus работает под управлением Android 6.0, vs 5.x и 4.x для наших тестовых телефонов.

Использование кода для добавления маркера

for(i=0;i<latLngs.size;i++) { LatLng latLng=latLngs.get(i); Marker m = mMap.addMarker(new MarkerOptions().position(latLng).title("Title").icon(BitmapDescriptorFactory.fromResource(R.drawable.marker))); } 

Для изменения значка маркера с помощью

  m.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.marker1)); 

На устройстве nexus google map выглядит как внизу, некоторые из маркеров становятся белыми, я использую цикл для добавления маркеров.

Введите описание изображения здесь

Solutions Collecting From Web of "Пользовательские маркеры, показывающие белый цвет на некоторых устройствах (Google Maps v3 Android SDK)"

EDIT: с версии 9.2.56 приложения Google Play Services, выпущенного 13 июня, исправлена ​​ошибка.

Я нашел обходной путь к вашей проблеме, однако он довольно уродлив, и, вероятно, не рекомендуется использовать его, если вы не знаете, что собираетесь использовать небольшое количество маркеров.

Вместо этого:

 //Getting a reference to your activity's resources final Resources resources = myActivity.getResources(); //Defining your drawable res id final int resId = R.drawable.my_drawable_res_id; marker.setIcon(BitmapDescriptorFactory.fromResource(resId)); 

Сделай это:

 //Getting a reference to your activity's resources final Resources resources = myActivity.getResources(); //Defining your drawable res id final int resId = R.drawable.my_drawable_res_id; marker.setIcon( BitmapDescriptorFactory.fromBitmap( BitmapFactory.decodeResource(resources, resId))); 

Обходное решение найдено после прочтения этой ссылки (спасибо @antonio в ваших комментариях): https://code.google.com/p/gmaps-api-issues/issues/detail?id=9765

Ошибка вызвана некоторыми устройствами с последней версией библиотеки Служб Google Play (возможно, 8.7+ или 9+).

Это происходит, если вы делитесь BitmapDescriptor с несколькими маркерами, поэтому обходным путем является его повторное создание каждый раз. Я думаю, что BitmapDescriptorFactory.fromResource может каким-то образом кэшировать ресурсы чтения, поэтому вам нужно декодировать его как растровое изображение.

Вот цитата из ответа № 10 трансбао по ссылке antonio:

Мы можем воспроизвести эту ошибку, которая приводит к тому, что некоторые маркерные значки отображаются в виде белых патчей. Ваше приложение может быть затронуто, если растровое изображение значка разделяется между несколькими маркерами, хотя проблема проявляется только в конкретных сценариях использования.

В краткосрочной перспективе мы рекомендуем использовать обходной путь в # 8 – использовать для каждого маркера уникальный объект Bitmap:

Marker.setIcon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.drawable.drawableid)));

а также

New MarkerOptions (). Icon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.drawable.drawableid)));

Создание BitmapDescriptor один раз и повторное использование будет недостаточным. Например, если вы делаете:

BitmapDescriptor bd = …; marker1.setIcon (шд); marker2.setIcon (шд);

… тогда обходным путем было бы:

Marker1.setIcon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.drawable.drawableid))); Marker2.setIcon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (getResources (), R.drawable.drawableid)));

Обратите внимание, что если ваше приложение использует множество маркеров, это решение может привести к увеличению потребления памяти. К сожалению, обходной путь не применяется, когда значок по умолчанию используется через BitmapDescriptorFactory.defaultMarker ().