У меня есть сервер, который отправляет изображения в кодировке png base64 в приложение для Android, которое отображает его в виде маркеров GoogleMap.
Я проверил, что если я использую drawable, все работает, поэтому проблема здесь в растровом изображении, созданном из данных, полученных с сервера.
Вот код PHP, который читает файл png и кодирует данные изображения:
if (($imgdata = file_get_contents($fname)) !== false) {
$icon = base64_encode($imgdata);
}
Полученная на андроид строка такая:
iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAEKUlEQVR4nO3bPWgcRxQH8GusgBEqDgyp5CKq3JkYggsHQQKbeaMj1UGqQEgRCKiw3ViF4XBxkeeNrhCIJBAMgUDApJAakcIgNG+0HFgEF6fKLhKMERhMEMZgubkUtxaJoqDd2zeavc37weuO2zf/ud3bj9lGQwghhBBCCCGEEEIIIYQQQgghhBBCCCHE/8uK++QjJPgBCQ6RYGic2jBeX4vdV+11dlvn0UEXCV4hwfBYPUcPS53d1vnYfdYWelg6Ifh/lCV1M3aftXTXw5X/+OX/a0+wXqnY/dbKal/NGNIPcoSf7QV6sNpXM7H7rg3j9GLe8I/KQTd237Ww7FuzSPC08AQQHKxsq8ux+594Y/36jw5F8E3s/iceEjwcdwKQ1LO1rfnp2GOYWMbra0j65fgTAENL+uvj37vaVzPoYQk9rFvSA/Swbp26FGOMlYZO3ykTPhIMDekHb7+vlyZN9Oo2EuzL6espVjfVO0jQLzsBSHCw7FuzZgveNU5tnPLZJ8u+NRt77JVgnbrEEP7RnzES/Jjr807fiT32SjCk21wTUKg8/BZ77JVgCe5HmQCCN0jwRezxR2dJDyJNwBAJNr/fff9c7AzOBBJ8YB1ct16pzl57qtFoNNa25qdxvKtftqr984Vemsxlh5k//zbwR0hwr8zVL2PdiJ1RMGtb89ORDzGnliU9eLtH1g7HBdbZlP44dlbscGfhKmbPciegvoudFzvj9E8VCDZv/d5Lk7nYmbHppUkTCZ5XINgi1YmdG5tsRUPsQIvW69rcKcW892OqVh5+iZ1daV2nLuDJt4EnoPRLQ7odO8NS0MGn8YMsVft3PVyJnePY0OsvKxBi2dqc2Isz9LBegQBLl/FwK3aWhXX22lNI8CRYME6l2RlWBwk66KCLTqWBtvfCOp3EzrSQXprMhQlDPTNOL5608qGXJk1D6nN0+nGAbf9hd+BijCzHkt1+YA8hz5/iyra6jAR77NufpFNT9PAVcwD7Zke9l3f72fsE3PefDq2D6yFzY4OkfuYc/Dh/hNmDee69cB93Fq6GyIwVEji2QTuV9tKkWbSH7FB0EOBQtB4iMzZ2Gz7E0YNurgEvjduLIW0D7AWv0OnPODNjZUnd5Bps2XX/SAvzGOZZRL/r1AXO3Fh09tpT6GGba6DGqY2yPXH2w7VnBpOdfbAN0ji9WLYn4+DbIBNAcFi529Y51mIWmwCGpSLWKxVoAoaGtOXIjcXopbpyS8uPF8fjwexlvyATgKNHmIXP0IJAgnvcA+SYgHC3RUZViYuz0YsVuV4pLfTr4lguGHoCKnFdYDzcYh+Y0485egs+AQSvOfoshfvYn9VDjt7OYA+Iv7wdSf3KPTBLcJ+jt16aNEM9K7CkB5U7FRVCCCGEEEIIIYQQQgghhBBCCCGEEEII0Wj8BW3/3m0HjJ8xAAAAAElFTkSuQmCC
Здесь успешно расшифрован http://www.freeformatter.com/base64-encoder.html
Вот сторона андроида, которая декодирует данные изображения:
private Bitmap getCatBitmap() {
byte[] decodedByte = null;
try {
decodedByte = Base64.decode(catB64Bitmap, Base64.DEFAULT);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
private BitmapDescriptor getIconMapFromCategory(int category) {
Bitmap bm;
BitmapDescriptor BMDesc;
int mode = 1;
if (mode == 0) {
// works
bm = drawableToBitmap(mActivity.getResources().getDrawable(R.drawable.logo_gm));
BMDesc = BitmapDescriptorFactory.fromBitmap(bm);
} else {
// Cause cluster to crash
bm = site.getSiteCategoriesList().get(category).getCatBitmap();
BMDesc = BitmapDescriptorFactory.fromBitmap(bm);
}
return BMDesc;
}
И вот я выполняю этот код:
markerOptions.position(sitePos)
.title(cursor.getString(cursor.getColumnIndex(SitesDBOpenHelper.KEY_NAME)))
.snippet(categoryName)
.icon(getIconMapFromCategory(category));
site.getMarkersList().put(Long.parseLong(cursor.getString(cursor.getColumnIndex(SitesDBOpenHelper.KEY_REMOTE_ID))),
SiteMarker.getSiteMarkerInfos(
Long.parseLong(cursor.getString(cursor.getColumnIndex(SitesDBOpenHelper.KEY_REMOTE_ID))),
cursor.getString(cursor.getColumnIndex(SitesDBOpenHelper.KEY_TYPE)),
markerOptions));
mClusterManager.addItem(site.getMarkersList().get(key));
mClusterManager.cluster();
Этот код вылетает при отображении маркеров. Если я заменю изображение в кодировке base64 на растровое изображение из прорисовки, маркеры отображаются правильно.
Не могли бы вы сказать мне, в чем здесь проблема?
РЕДАКТИРОВАТЬ: Добавить отчет о сбое: и изменить getIconMapFromCategory (), чтобы лучше объяснить, в каком случае кластер вызывает сбой.
11-29 10:41:01.959 6283-6283/com.ndguide.ndguide E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ndguide.ndguide, PID: 6283
java.lang.NullPointerException
com.google.a.a.ae.a(Unknown Source)
com.google.maps.api.android.lib6.d.dn.<init>(Unknown Source)
com.google.maps.api.android.lib6.d.dm.a(Unknown Source)
com.google.maps.api.android.lib6.d.ag.<init>(Unknown Source)
com.google.maps.api.android.lib6.d.eu.a(Unknown Source)
com.google.android.gms.maps.internal.j.onTransact(SourceFile:167)
android.os.Binder.transact(Binder.java:387)
com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source)
com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
com.google.maps.android.MarkerManager$Collection.addMarker(MarkerManager.java:154)
com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:816)
com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.access$2000(DefaultClusterRenderer.java:785)
com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:624)
at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:596)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:148)
android.app.ActivityThread.main(ActivityThread.java:5417)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
И сбой происходит, когда DefautClusterRender.class выполняет:
markerWithPosition2 = DefaultClusterRenderer.this.mClusterManager.getMarkerCollection().addMarker(markerOptions1);
Но странно, что в отчете о сбое Binder.java:387 не существует, когда я дважды щелкаю по нему, я не собираюсь писать строку кода, а SourceFile: 167 предлагает 2 файла Java, но строка 167 не существует. или.
Могу ли я решить проблему с файлом googleplayservices_lib, который я использую?
Задача ещё не решена.
Других решений пока нет …