Pierre87 Posté(e) 16 novembre 2010 Share Posté(e) 16 novembre 2010 Je suis récemment tombé sur un bug complètement stupide au niveau du MyLocationOverlay (qui permet d'afficher la position d'un utilisateur sur une carte très facilement). Sur certains téléphones ça marche très bien, sur d'autres ça plante lamentablement car l'OS n'arrive pas à charger l'image du point. Je ne sais pas si ça vient de Google, où si c'est un constructeur qui fait n'importe quoi... J'ai eu ce soucis sur un Acer Stream, et sur certains téléphones Motorola. La solution la plus efficace consiste à sous classer MyLocationOverlay, et de bricoler la méthode "drawMyLocation" (les autres méthodes étant private). Voilà le site expliquant le problème plus en détail : http://dimitar.me/applications-that-use-the-mylocationoverlay-class-crash-on-the-new-droid-x/ Et la classe en question : package com.spectrekking.play; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Paint.Style; import android.graphics.drawable.Drawable; import android.location.Location; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.MyLocationOverlay; import com.google.android.maps.Projection; import com.spectrekking.R; public class FixedMyLocationOverlay extends MyLocationOverlay { private boolean bugged = false; private Paint accuracyPaint; private Point center; private Point left; private Drawable drawable; private int width; private int height; public FixedMyLocationOverlay(Context context, MapView mapView) { super(context, mapView); } @Override protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLoc, long when) { if (!bugged) { try { super.drawMyLocation(canvas, mapView, lastFix, myLoc, when); } catch (Exception e) { bugged = true; } } if (bugged) { if (drawable == null) { accuracyPaint = new Paint(); accuracyPaint.setAntiAlias(true); accuracyPaint.setStrokeWidth(2.0f); drawable = mapView.getContext().getResources().getDrawable(R.drawable.mylocation); width = drawable.getIntrinsicWidth(); height = drawable.getIntrinsicHeight(); center = new Point(); left = new Point(); } Projection projection = mapView.getProjection(); double latitude = lastFix.getLatitude(); double longitude = lastFix.getLongitude(); float accuracy = lastFix.getAccuracy(); float[] result = new float[1]; Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result); float longitudeLineDistance = result[0]; GeoPoint leftGeo = new GeoPoint((int)(latitude*1e6), (int)((longitude-accuracy/longitudeLineDistance)*1e6)); projection.toPixels(leftGeo, left); projection.toPixels(myLoc, center); int radius = center.x - left.x; accuracyPaint.setColor(0xff6666ff); accuracyPaint.setStyle(Style.STROKE); canvas.drawCircle(center.x, center.y, radius, accuracyPaint); accuracyPaint.setColor(0x186666ff); accuracyPaint.setStyle(Style.FILL); canvas.drawCircle(center.x, center.y, radius, accuracyPaint); drawable.setBounds(center.x - width / 2, center.y - height / 2, center.x + width / 2, center.y + height / 2); drawable.draw(canvas); } } } Vous remarquerez l'utilisation ingénieuse de la variable "bugged" ^^ Le point et la "zone de précision" sont identiques à ce qui est fait dans le MyLocationOverlay d'origine. Sauf que le point fourni est orange au lieu d'être bleu :P Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.