Since this was brought back up ... this worked for me as well for the Cliq
(original issue).

Also, FYI, I found that an easier way to get the distance for the circle
radius is to simply use Projection.metersToEquatorPixels(float), which
converts a distance in meters to pixel units.

I also added simple animation to more closely match the default
implementation by simply alternating which Drawable is used in the draw()
call every half second or so.

On Fri, Jan 22, 2010 at 5:54 AM, Johan Nilsson <markupart...@gmail.com>wrote:

> Thank you Pieter for the code snippet.
>
> I can also confirm that this workaround is needed for Samsung Spica,
> phone model GT-I5700
> with android 1.5.
>
> Johan
>
> On Fri, Nov 13, 2009 at 10:12 AM, Pieter <pie...@gamesquare.nl> wrote:
> > Allright, I have taken up the gauntlet and wrote a subclass for
> > working around this bug.
> > It draws the "my location" disc and an accuracy circle.  You can test
> > it on a device that is
> > not bugged by initializing the "bugged" variable to true.
> >
> > It is a quick and dirty hack but it seems to work correctly on my G1,
> > although the calculations
> > might be way off when you are near the poles ;-). I hope to have some
> > more feedback from an
> > actual Cliq user later today.
> >
> > You are free to use and adapt the source code as you see fit:
> > http://www.spectrekking.com/download/FixedMyLocationOverlay.java
> >
> > And the accompanying drawable:
> > http://www.spectrekking.com/download/mylocation.png
> >
> > I made the drawable orange instead of blue on purpose so users can see
> > when their device is bugged.
> > Note that there is no animation on GPS activity (as there is in the
> > original MyLocationOverlay).
> >
> > On a related note: it seems that the "Google logo" drawable is also
> > bugged on the Cliq as I get reports
> > of a "red square in the lower left where the Google logo is supposed
> > to be". I don't really see any
> > workaround for that one.
> >
> > If you find any problems with this solution, or have any improvements
> > to share please let us know!
> >
> > ---------------
> > 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);
> >                }
> >        }
> > }
> > ---------------
> > On Nov 12, 10:57 pm, TreKing <treking...@gmail.com> wrote:
> >> Yeah, it's better than a force-close, that's for sure.
> >>
> >> Though getting the pixel radius for the circle shouldn't be too hard.
> With
> >> the GPS accuracy value you can get a latitude / longitude value that's
> an
> >> offset from the current estimated location, map those two points to
> screen
> >> space with the MapView projection, and you have the circle radius in
> pixels
> >> as the difference.
> >>
> >> I'll give it a shot when I get around to putting in this stop-gap for
> the
> >> Cliq and post back with what I find.
> >>
> >> TreKing - Chicago transit tracking app for Android-powered
> deviceshttp://sites.google.com/site/rezmobileapps/treking
> >>
> >>
> >>
> >> On Thu, Nov 12, 2009 at 3:32 PM, chrispix <chris...@gmail.com> wrote:
> >> > You are correct. Until it is fixed, I figure this was a workaround
> >> > that would work :). You can pull accuracy from the GPS, although I am
> >> > not sure of the exact calculation to determine the pixel circle size
> >> > on screen based on the zoom view.
> >>
> >> > Chris.
> >>
> >> > On Nov 12, 2:36 pm, Pieter <pie...@gamesquare.nl> wrote:
> >> > > The only drawback is that the "accuracy indicator" (the blue circle
> >> > > indicating GPS accuracy) does not work in this case. With a little
> bit
> >> > > of work this could probably also be implemented, but it is a little
> >> > > more complex than just drawing an image.
> >>
> >> > > On Nov 12, 6:37 pm, chrispix <chris...@gmail.com> wrote:
> >>
> >> > > > Actually we got around it by drawing our own dot on the screen..
> Here
> >> > > > is a code snippit.. Inside our
> >>
> >> > > >                 @Override
> >> > > >                 public void drawMyLocation(Canvas canvas, MapView
> >> > mapView, Location
> >> > > > lastFix, GeoPoint myLocation, long when)
> >> > > > .
> >> > > > .
> >> > > > .
> >>
> >> > > >                                 try {
> >>
> >> > super.drawMyLocation(canvas,mapView,lastFix,p,when);
> >> > > >                                 }
> >> > > >                                 catch (Exception e)
> >> > > >                                 {
> >> > > >                                         <DRAW YOUR BITMAP HERE>
> >> > > >                                 }
> >>
> >> > > > Chris.
> >>
> >> > > > On Nov 12, 11:21 am, chrispix <chris...@gmail.com> wrote:
> >>
> >> > > > > It appears to be on the Cliq only..
> >> > > > > I actually reported the bug first when it was seen in Cyanogen.
> >>
> >> >http://code.google.com/p/cyanogenmod/issues/detail?can=2&q=344&colspe.
> ..
> >>
> >> > > > > They fixed it. Looks like they had same issue
> >>
> >> > > > > Chris.
> >>
> >> > > > > On Nov 12, 10:44 am, TreKing <treking...@gmail.com> wrote:
> >>
> >> > > > > > I also have a user reporting a map crash when using a feature
> in my
> >> > app that
> >> > > > > > uses MyLocationOverlay.
> >> > > > > > He's also using the Cliq, running 1.5. I cannot reproduce the
> issue
> >> > on my G1
> >> > > > > > with 1.6 or in the emulator running 1.5.
> >> > > > > > I'll post back if I get more information from the user on when
> this
> >> > happens.
> >> > > > > > I haven't had any other complaints about this and it's a
> pretty
> >> > blatant
> >> > > > > > issue (crashes as soon as the maps is opened) so I'm assuming
> is
> >> > isolated to
> >> > > > > > his phone, perhaps the Cliq specifically based on Chris's
> post.
> >>
> >> > > > > > Is it possible for the Cliq to have a non-standard build of
> the
> >> > maps
> >> > > > > > library?
> >>
> >> > > > > > On Thu, Nov 12, 2009 at 9:02 AM, chrispix <chris...@gmail.com
> >
> >> > wrote:
> >> > > > > > > We are having this issue on the cliq..
> >>
> >> > > > > > > Chris.
> >>
> >> > > > > > > On Oct 20, 2:53 am, shalafi <sla.shal...@gmail.com> wrote:
> >> > > > > > > > I have seen exactly the same problem, but only
> reproducible in
> >> > some
> >> > > > > > > > phones with non standar builds. Anyway, they are 1.5
> flavour.
> >>
> >> > > > > > > > The same piece of code works perfectly in a 1.6 G1 Dev
> Phone.
> >>
> >> > > > > > > > If you extend MyLocationOverview and overwrite the draw
> method
> >> > it does
> >> > > > > > > > not crash... anyway this is not a solution since "my
> location"
> >> > is not
> >> > > > > > > > displayed, but proves that this is the prblem.
> >>
> >> > > > > > > > What I am very curious about is that Google Maps works
> fine in
> >> > that
> >> > > > > > > > phone.
> >>
> >> > > > > > > > On Sep 28, 11:36 pm, CaptainSpam <captains...@gmail.com>
> >> > wrote:
> >>
> >> > > > > > > > > Well, I suppose you do have a point.  I just thought
> that
> >> > 1.6's
> >> > > > > > > > > "proper" release was a bit more imminent.
> >>
> >> > > > > > > > > I'll check back once Donut's fully ready for prime time,
> >> > then.
> >> > > > > > > > > Thanks!
> >>
> >> > > > > > > > > On Sep 26, 8:48 am, MrChaz <mrchazmob...@googlemail.com
> >
> >> > wrote:
> >>
> >> > > > > > > > > > Well if they will install a non-released version of
> the OS
> >> > then
> >> > > > > > > that's
> >> > > > > > > > > > to be expected.
> >>
> >> > > > > > > > > > On Sep 25, 10:04 pm, CaptainSpam <
> captains...@gmail.com>
> >> > wrote:
> >>
> >> > > > > > > > > > > Recently, two independent users with 1.6 (Donut) on
> their
> >> > phones
> >> > > > > > > have
> >> > > > > > > > > > > informed me that my app crashes after it enters a
> >> > MapView, just as
> >> > > > > > > > > > > soon as MyLocationOverlay obtains its first location
> fix.
> >> >  I have
> >> > > > > > > seen
> >> > > > > > > > > > > it do so with one of them, in fact.  However, when I
> >> > asked for a
> >> > > > > > > > > > > logcat, what they sent me seems to indicate the
> crash
> >> > originated
> >> > > > > > > from
> >> > > > > > > > > > > an uncaught ClassCastException thrown from within
> >> > MyLocationOverlay
> >> > > > > > > > > > > itself, not from my code.  Worse, I tried running
> this on
> >> > the 1.6
> >> > > > > > > > > > > emulator and couldn't make it crash (I don't have
> 1.6 on
> >> > my actual
> >> > > > > > > > > > > phone yet), so I am completely lost with this and
> unsure
> >> > if it's
> >> > > > > > > > > > > something odd they were doing on their phones or
> >> > something I will
> >> > > > > > > have
> >> > > > > > > > > > > to worry about when 1.6 gets rolled out to more
> people.
> >>
> >> > > > > > > > > > > One user has tried uninstalling/reinstalling the app
> >> > numerous
> >> > > > > > > times,
> >> > > > > > > > > > > as well as disabling Dalvik-Cache, all to no avail.
>  This
> >> > app works
> >> > > > > > > > > > > perfectly on both 1.1 and 1.5 phones.  I also tried
> >> > recompiling the
> >> > > > > > > > > > > app explicitly using the 1.6 SDK, and it still
> crashed
> >> > (as per the
> >> > > > > > > > > > > user I talked to).  Is there anything I would need
> to
> >> > consider with
> >> > > > > > > > > > > regards to MyLocationOverlay when upgrading to 1.6?
> >>
> >> > > > > > > > > > > Thanks in advance!
> >>
> >> > > > > > > > > > > --
> >> > > > > > > > > > > Nicholas Killewald
> >>
> >> > > > > > > > > > > What follows is the logcat I received from one user
> >> > (apologies for
> >> > > > > > > any
> >> > > > > > > > > > > formatting problems).  I would provide a code
> snippet,
> >> > but since
> >> > > > > > > the
> >> > > > > > > > > > > exception didn't come from my code, I'm not sure
> what I
> >> > would need
> >> > > > > > > to
> >> > > > > > > > > > > paste.
> >>
> >> > > > > > > > > > > 09-22 11:38:16.106 I/ActivityManager(  158):
> Displayed
> >> > activity
> >> > > > > > > > > > > net.exclaimindustries.geohashdroid/.MainMap: 2846 ms
> >> > (total 2846
> >> > > > > > > ms)
> >> > > > > > > > > > > 09-22 11:38:16.767 D/libgps  (  158):
> PDSM_PD_EVENT_BEGIN
> >> > > > > > > > > > > 09-22 11:38:16.767 D/GpsLocationProvider(  158):
> >> > Acquiring wakelock
> >> > > > > > > > > > > 09-22 11:38:16.866 D/libgps  (  158):
> >> > PDSM_PD_EVENT_COMM_BEGIN
> >> > > > > > > > > > > 09-22 11:38:16.876 D/libgps  (  158): calling
> >> > sAGpsStatusCallback
> >> > > > > > > > > > > GPS_REQUEST_AGPS_DATA_CONN
> >> > > > > > > > > > > 09-22 11:38:16.916 D/libgps  (  158):
> >> > qct_agps_data_conn_open:
> >> > > > > > > > > > > epc.tmobile.com
> >> > > > > > > > > > > 09-22 11:38:16.916 D/libgps  (  158):
> >> > DeferredActionThread calling
> >> > > > > > > > > > > send_pdsm_atl_post_event PDSM_ATL_EVENT_OPEN_SUCCESS
> >> > > > > > > epc.tmobile.com
> >> > > > > > > > > > > 09-22 11:38:17.501 D/libgps  (  158):
> >> > PDSM_PD_EVENT_COMM_CONNECTED
> >> > > > > > > > > > > 09-22 11:38:17.926 D/libgps  (  158):
> >> > PDSM_PD_EVENT_GPS_BEGIN
> >> > > > > > > > > > > 09-22 11:38:18.336 D/libgps  (  158):
> >> > PDSM_PD_EVENT_COMM_DONE
> >> > > > > > > > > > > 09-22 11:38:19.088 D/libgps  (  158): calling
> >> > sAGpsStatusCallback
> >> > > > > > > > > > > GPS_RELEASE_AGPS_DATA_CONN
> >> > > > > > > > > > > 09-22 11:38:19.088 D/libgps  (  158):
> >> > qct_agps_data_conn_closed
> >> > > > > > > > > > > 09-22 11:38:19.216 D/dalvikvm(  730): GC(0) freed
> 8209
> >> > objects /
> >> > > > > > > > > > > 611880 bytes in 109ms
> >> > > > > > > > > > > 09-22 11:38:19.966 D/NetworkLocationProvider(  158):
> >> > getLocation():
> >> > > > > > > > > > > falling back to cell
> >> > > > > > > > > > > 09-22 11:38:20.126 I/ActivityManager(  158): Start
> proc
> >> > > > > > > > > > > com.google.android.apps.maps:LocationFriendService
> for
> >> > service
> >> > > > > > > > > > > com.google.android.apps.maps/
> >>
> >> > com.google.googlenav.friend.android.LocationFriendService: pid=750
> >> > > > > > > > > > > uid=10025 gids={3003}
> >> > > > > > > > > > > 09-22 11:38:20.366 I/Maps.MyLocationOverlay(  730):
> >> > Running
> >> > > > > > > deferred
> >> > > > > > > > > > > on first fix:
> net.exclaimindustries.geohashdroid.MainMap
> >> > > > > > > > > > > $initiallocationadjus...@439ec528
> >> > > > > > > > > > > 09-22 11:38:20.566 I/ActivityManager(  158): Process
> >> > > > > > > com.android.mms
> >> > > > > > > > > > > (pid 614) has died.
> >> > > > > > > > > > > 09-22 11:38:20.576 D/AndroidRuntime(  730): Shutting
> down
> >> > VM
> >> > > > > > > > > > > 09-22 11:38:20.576 W/dalvikvm(  730): threadid=3:
> thread
> >> > exiting
> >> > > > > > > with
> >> > > > > > > > > > > uncaught exception (group=0x4001e210)
> >> > > > > > > > > > > 09-22 11:38:20.576 E/AndroidRuntime(  730): Uncaught
> >> > handler:
> >> > > > > > > thread
> >> > > > > > > > > > > main exiting due to uncaught exception
> >> > > > > > > > > > > 09-22 11:38:20.636 E/AndroidRuntime(  730):
> >> > > > > > > > > > > java.lang.ClassCastException:
> >> > > > > > > android.graphics.drawable.BitmapDrawable
> >> > > > > > > > > > > 09-22 11:38:20.636 E/AndroidRuntime(  730): at
> >> > > > > > > > > > >
> com.google.android.maps.MyLocationOverlay.getLocationDot
> >>
> >> ...
> >>
> >> read more ยป
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Android Developers" group.
> > To post to this group, send email to android-developers@googlegroups.com
> > To unsubscribe from this group, send email to
> > android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> > For more options, visit this group at
> > http://groups.google.com/group/android-developers?hl=en
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>



-- 

-------------------------------------------------------------------------------------------------
TreKing - Chicago transit tracking app for Android-powered devices
http://sites.google.com/site/rezmobileapps/treking

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to