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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>> > wrote:
>> > > > > > > We are having this issue on the cliq..
>>
>> > > > > > > Chris.
>>
>> > > > > > > On Oct 20, 2:53 am, shalafi <[email protected]> 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 <[email protected]>
>> > 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 <[email protected]>
>> > 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 <[email protected]>
>> > 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 [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to