MyLocationOverlay causing crash in 1.6 (Donut)

210 views
Skip to first unread message

CaptainSpam

unread,
Sep 25, 2009, 5:04:58 PM9/25/09
to Android Developers
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
$InitialLocationAdjuster@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
(MyLocationOverlay.java:180)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.google.android.maps.MyLocationOverlay.drawMyLocation
(MyLocationOverlay.java:561)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.google.android.maps.MyLocationOverlay.draw(MyLocationOverlay.java:
511)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:45)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.google.android.maps.MapView.onDraw(MapView.java:476)
09-22 11:38:20.636 E/AndroidRuntime( 730): at android.view.View.draw
(View.java:6274)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.drawChild(ViewGroup.java:1526)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.drawChild(ViewGroup.java:1524)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
09-22 11:38:20.636 E/AndroidRuntime( 730): at android.view.View.draw
(View.java:6277)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.widget.FrameLayout.draw(FrameLayout.java:352)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.drawChild(ViewGroup.java:1526)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
09-22 11:38:20.636 E/AndroidRuntime( 730): at android.view.View.draw
(View.java:6277)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.widget.FrameLayout.draw(FrameLayout.java:352)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.android.internal.policy.impl.PhoneWindow$DecorView.draw
(PhoneWindow.java:1883)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewRoot.draw(ViewRoot.java:1332)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewRoot.performTraversals(ViewRoot.java:1097)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.os.Handler.dispatchMessage(Handler.java:99)
09-22 11:38:20.636 E/AndroidRuntime( 730): at android.os.Looper.loop
(Looper.java:123)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
android.app.ActivityThread.main(ActivityThread.java:4203)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
java.lang.reflect.Method.invokeNative(Native Method)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
java.lang.reflect.Method.invoke(Method.java:521)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:791)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
09-22 11:38:20.636 E/AndroidRuntime( 730): at
dalvik.system.NativeStart.main(Native Method)
09-22 11:38:20.686 I/Process ( 158): Sending signal. PID: 730 SIG: 3
09-22 11:38:20.686 I/dalvikvm( 730): threadid=7: reacting to signal 3
09-22 11:38:20.836 I/dalvikvm( 730): Wrote stack trace to '/data/anr/
traces.txt'
09-22 11:38:21.456 D/LocationManager( 750): Constructor: service =
android.location.ILocationManager$Stub$Proxy@439e2170
09-22 11:38:22.286 I/ActivityManager( 158): Process fr.galize.android
(pid 628) has died.
09-22 11:38:22.336 I/Process ( 730): Sending signal. PID: 730 SIG: 9
09-22 11:38:22.366 I/ActivityManager( 158): Stopping service:
com.google.android.apps.maps/
com.google.googlenav.friend.android.LocationFriendService
09-22 11:38:22.526 D/Sensors ( 158): sensors=00000001, real=00000001
09-22 11:38:22.526 I/WindowManager( 158): WIN DEATH: Window{43cc82f0
net.exclaimindustries.geohashdroid/
net.exclaimindustries.geohashdroid.MainMap paused=false}
09-22 11:38:22.526 I/ActivityManager( 158): Process
net.exclaimindustries.geohashdroid (pid 730) has died.
09-22 11:38:22.546 W/GpsLocationProvider( 158): Unneeded remove
listener for uid 1000
09-22 11:38:22.556 D/NetworkLocationProvider( 158): removeListener():
settings
09-22 11:38:22.566 I/WindowManager( 158): WIN DEATH: Window{43c5c840
net.exclaimindustries.geohashdroid/
net.exclaimindustries.geohashdroid.GeohashDroid paused=false}
09-22 11:38:22.576 D/NetworkLocationProvider( 158): removeListener():
server.checkin
09-22 11:38:22.576 D/NetworkLocationProvider( 158): removeListener():
android
09-22 11:38:22.576 D/NetworkLocationProvider( 158): removeListener():
providers.subscribedfeeds
09-22 11:38:22.576 D/NetworkLocationProvider( 158): removeListener():
location
09-22 11:38:22.596 D/NetworkLocationProvider( 158): removeListener():
org.zenthought.android.su
09-22 11:38:22.596 D/NetworkLocationProvider( 158): removeListener():
providers.settings
09-22 11:38:22.596 D/NetworkLocationProvider( 158): removeListener():
server.vpn
09-22 11:38:22.596 D/GpsLocationProvider( 158): stopNavigating
09-22 11:38:22.596 D/libgps ( 158): qct_gps_stop
09-22 11:38:22.596 D/NetworkLocationProvider( 158): setMinTime: 540000

MrChaz

unread,
Sep 26, 2009, 8:48:10 AM9/26/09
to Android Developers
Well if they will install a non-released version of the OS then that's
to be expected.

CaptainSpam

unread,
Sep 28, 2009, 5:36:00 PM9/28/09
to Android Developers
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!

shalafi

unread,
Oct 20, 2009, 4:53:52 AM10/20/09
to Android Developers
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.

chrispix

unread,
Nov 12, 2009, 10:02:37 AM11/12/09
to Android Developers
We are having this issue on the cliq..

Chris.
> ...
>
> read more »

TreKing

unread,
Nov 12, 2009, 11:44:37 AM11/12/09
to android-d...@googlegroups.com
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?


--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-d...@googlegroups.com
To unsubscribe from this group, send email to
android-develop...@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

chrispix

unread,
Nov 12, 2009, 12:21:06 PM11/12/09
to Android Developers
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&colspec=ID%20Type%20Status%20Priority%20Version%20Owner%20Summary%20Stars%20Modified&id=344

They fixed it. Looks like they had same issue

Chris.
> ...
>
> read more »

chrispix

unread,
Nov 12, 2009, 12:37:22 PM11/12/09
to Android Developers
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...
> ...
>
> read more »

TreKing

unread,
Nov 12, 2009, 1:29:46 PM11/12/09
to android-d...@googlegroups.com
Thanks for the info and code snippet. At least I know where to go from here. Of course without an actual Cliq device I have no way of truly testing and verifying this, so this should be fun.

It's sad that it's up to developers to add special-case code to compensate for a device's bugged version of the platform.

> ...
>
> 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-d...@googlegroups.com
To unsubscribe from this group, send email to
android-develop...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

chrispix

unread,
Nov 12, 2009, 2:26:02 PM11/12/09
to Android Developers
I already implemented that code into our live version of a2b, and we
got
feedback that it is working now. So that should fix it up for you.

Chris.
> ...
>
> read more »

Pieter

unread,
Nov 12, 2009, 3:36:11 PM11/12/09
to Android Developers
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.
> ...
>
> read more »

chrispix

unread,
Nov 12, 2009, 4:32:51 PM11/12/09
to Android Developers
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.
> ...
>
> read more »

TreKing

unread,
Nov 12, 2009, 4:57:42 PM11/12/09
to android-d...@googlegroups.com
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 devices
http://sites.google.com/site/rezmobileapps/treking

> ...
>
> read more »

Pieter

unread,
Nov 13, 2009, 4:12:58 AM11/13/09
to Android Developers
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
> ...
>
> read more »

Johan Nilsson

unread,
Jan 22, 2010, 6:54:55 AM1/22/10
to android-d...@googlegroups.com
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

TreKing

unread,
Jan 22, 2010, 3:39:06 PM1/22/10
to android-d...@googlegroups.com
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.
--

-------------------------------------------------------------------------------------------------
Reply all
Reply to author
Forward
0 new messages