Я использую базу данных Firebase в реальном времени, чтобы получить информацию о некоторых пользователях и показать собственный маркер для каждого .. чтобы установить значок для параметров маркера. Я использую метод, описанный ниже, и он работает в большинстве случаев.
Но чаще всего происходит сбой приложения при создании растрового изображения пользовательского представления для маркера ...! Есть ли способ улучшить метод и предотвратить проблемы с растровыми изображениями.!
Код
{ // other methods..
private void showMarker() {
BitmapDescriptor pin = BitmapDescriptorFactory
.fromBitmap(getMarkerBitmapFromView(data.getUserAvatar()));
userMarker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title(data.getName() + "")
.snippet(data.getSectionName() + "")
.icon(pin));
}
// I take pic url from firebase and show it into the marker view
private Bitmap getMarkerBitmapFromView(String ImgUrl) {
if (getActivity() != null) {
View customMarkerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker, null);
CircleImageView markerImageView = customMarkerView.findViewById(R.id.pic_user);
FrameLayout pin = customMarkerView.findViewById(R.id.marker);
pin.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.map_marker_green));
Picasso.with(getActivity())
.load(ImgUrl)
.resize(80, 80)
.error(R.drawable.user_dummy)
.placeholder(R.drawable.user_dummy)
.into(markerImageView);
customMarkerView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
customMarkerView.layout(0, 0, customMarkerView.getMeasuredWidth(), customMarkerView.getMeasuredHeight());
customMarkerView.buildDrawingCache(true);
Bitmap returnedBitmap = Bitmap.createBitmap(customMarkerView.getMeasuredWidth(), customMarkerView.getMeasuredHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
canvas.drawColor(Color.WHITE, Mode.SRC_IN);
Drawable drawable = customMarkerView.getBackground();
if (drawable != null) {
drawable.draw(canvas);
}
customMarkerView.draw(canvas);
return returnedBitmap;
} else {
// the crash didn't happen because of this! I've checked using breakpoints, it returns bitmap 99.9% of times.
return null;
}
}
}
Ошибка
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.arapeak.katateeb, PID: 30706
com.google.maps.api.android.lib6.common.apiexception.b: Failed to decode image. The provided image must be a Bitmap.
at com.google.maps.api.android.lib6.impl.k.a(:com.google.android.gms.dynamite_dynamitemodulesb@12529020@12.5.29 (040308-192802242):5)
at com.google.maps.api.android.lib6.impl.o.a(:com.google.android.gms.dynamite_dynamitemodulesb@12529020@12.5.29 (040308-192802242):7)
at com.google.maps.api.android.lib6.impl.db.<init>(:com.google.android.gms.dynamite_dynamitemodulesb@12529020@12.5.29 (040308-192802242):25)
at com.google.maps.api.android.lib6.impl.bc.a(:com.google.android.gms.dynamite_dynamitemodulesb@12529020@12.5.29 (040308-192802242):496)
at com.google.android.gms.maps.internal.l.onTransact(:com.google.android.gms.dynamite_dynamitemodulesb@12529020@12.5.29 (040308-192802242):94)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.internal.zzeu.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzg.addMarker(Unknown Source)
at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)