in my app I have an overlay of pins that marks a point of interest. I also want to show the users current location using mylocationoverlay. However when I try to combine the two I get this error from my stack trace and it crashes when I run it on my phone
09-03 12:38:22.345: WARN/System.err(361): IOException processing: 26
java.io.IOException: Server returned: 3
at android_maps_conflict_avoidance.com.google.googlenav.map.BaseTileRequest.readResponseData(BaseTileRequest.java:115):
at android_maps_conflict_avoidance.com.google.googlenav.map.MapService$MapTileRequest.readResponseData(MapService.java:1473)
at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher.processDataRequest(DataRequestDispatcher.java:1117)
at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher$DispatcherServer.run(DataRequestDispatcher.java:1702)
at java.lang.
Thread.run(Thread.java:1019)
Here is the code I am using. I have the mylocationoverlay created in the oncreate method and I have the other overlay created in the reload async task
public class Maps extends MapActivity {
ProgressDialog progressDialog;
private ArrayList<Pins> mList;
final public static int[] pincolorstar = { R.drawable.pinredstar,
R.drawable.pinlitebluestar, R.drawable.pinblackstar,
R.drawable.pindarkbluestar, R.drawable.pingreenstar,
R.drawable.pinlitegreenstar, R.drawable.pinorangestar,
R.drawable.pinyellowstar, R.drawable.pinwhitestar,
R.drawable.pinpurplestar };
static boolean setSatellite, setHybrid = false;
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
protected void onCreate(Bundle icicle) {
// TODO Auto-generated method stub
super.onCreate(icicle);
try {
setContentView(R.layout.maps);
} catch (Exception e) {
e.printStackTrace();
}
final SharedPreferences prefs = getSharedPreferences("Settings", 0);
final int hour = prefs.getInt("Hour_Range", 4);
new Reload().execute();
Button done = (Button) findViewById(R.id.btnDone);
done.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Button change = (Button) findViewById(R.id.btnChangeTime);
change.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final int hour = prefs.getInt("Hour_Range", 4);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog,
(ViewGroup) findViewById(R.id.relativeLayoutMaps));
final SeekBar seekBar = (SeekBar) layout
.findViewById(R.id.seekBarChangeTime);
final TextView ChangeTexthour = (TextView) layout
.findViewById(R.id.tVChangeableTime);
ChangeTexthour.setText(prefs.getString("Hour_notification",
"Only most recent positions"));
seekBar.setProgress(hour);
OnSeekBarChangeListener yourSeekBarListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
ChangeTexthour
.setText(getResources()
.getString(
R.string.showlocationsforthelastxhours1)
+ " "
+ progress
+ " "
+ getResources()
.getString(
R.string.showlocationsforthelastxhours2));
}
};
seekBar.setOnSeekBarChangeListener(yourSeekBarListener);
AlertDialog.Builder builder = new AlertDialog.Builder(Maps.this)
.setView(layout)
.setPositiveButton(
getResources().getString(R.string.Cancel), null)
.setNegativeButton("Set",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
SharedPreferences.Editor editor = prefs
.edit();
editor.putString(
"Hour_notification",
getResources()
.getString(
R.string.showlocationsforthelastxhours1)
+ " "
+ seekBar.getProgress()
+ " "
+ getResources()
.getString(
R.string.showlocationsforthelastxhours2));
editor.putInt("Hour_Range",
seekBar.getProgress());
editor.commit();
new Reload().execute();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
Button displayChange = (Button) findViewById(R.id.btnDisplayChange);
displayChange.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(Maps.this)
.setMessage("Map Display Mode")
.setPositiveButton("Map",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setSatellite = false;
setHybrid = false;
new Reload().execute();
}
})
.setNeutralButton("Satellite",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setSatellite = true;
setHybrid = false;
new Reload().execute();
}
})
.setNegativeButton("Hybrid",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setHybrid = true;
setSatellite = false;
new Reload().execute();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
MapView mapView=(MapView) findViewById(R.id.mapView);
List<Overlay> overlays=mapView.getOverlays();
MyLocationOverlay myLocationOverlay=new MyLocationOverlay(Maps.this, mapView);
myLocationOverlay.enableMyLocation();
overlays.add(myLocationOverlay);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
private class Pins {
private String name;
private String time;
private String id;
private boolean mostrecent;
private Double longitude;
private Double latitude;
public Pins(String time, String id, String mostrecent,
Double longitude, Double latitude) {
this.time = time;
this.id = id;
this.longitude = longitude;
this.latitude = latitude;
boolean active = false;
if (mostrecent.equals("1"))
active = true;
else
active = false;
this.mostrecent = active;
}
public String getName() {
return name;
}
public String getTime() {
return time;
}
public String getId() {
return id;
}
public boolean getMostRecent() {
return mostrecent;
}
public Double getLongitude() {
return longitude;
}
public Double getLatitude() {
return latitude;
}
public void setName(String name) {
this.name = name;
}
}
public class Reload extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
final SharedPreferences prefs = getSharedPreferences("Settings", 0);
final int hour = prefs.getInt("Hour_Range", 4);
int followsize = 0;
for (int i = 0; i < ImTracking.ping.length; i++) {
followsize += ImTracking.ping[i];
}
String[] ids = new String[followsize];
int counter = 0;
for (int i = 0; i < ImTracking.ping.length; i++) {
if (ImTracking.ping[i] == 1) {
ids[counter] = ImTracking.pList.get(i).getid();
counter++;
}
}
JSONArray users = new JSONArray(Arrays.asList(ids));
HttpParams httpParams = new BasicHttpParams();
// 30seconds and it stops
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httpost = new HttpPost(
"https://iphone-radar.com/gps/gps_locations_fetch");
JSONObject holder = new JSONObject();
try {
holder.put("userids", users);
holder.put("range", hour);
Calendar c=Calendar.getInstance();
TimeZone tz=c.getTimeZone();
Date now=new Date();
int offsetFromUtc = tz.getOffset(now.getTime())/1000;
holder.put("timezone", offsetFromUtc);
StringEntity se = new StringEntity(holder.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httpost, responseHandler);
org.json.JSONObject obj = new org.json.JSONObject(response);
JSONArray tracking_users = obj.getJSONArray("d");
ArrayList<Pins> mList = new ArrayList<Pins>();
int minLat = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int minLon = Integer.MAX_VALUE;
int maxLon = Integer.MIN_VALUE;
for (int i = 0; i < tracking_users.length(); i++) {
JSONObject user = tracking_users.getJSONObject(i);
Pins pin = new Pins(user.getString("time"),
user.getString("user_id"),
user.getString("most_recent"),
user.getDouble("longitude"),
user.getDouble("latitude"));
maxLat = (int) Math.max(user.getDouble("latitude") * 1E6,
maxLat);
minLat = (int) Math.min(user.getDouble("latitude") * 1E6,
minLat);
maxLon = (int) Math.max(user.getDouble("longitude") * 1E6,
maxLon);
minLon = (int) Math.min(user.getDouble("longitude") * 1E6,
minLon);
mList.add(pin);
}
MapView mapView = (MapView) findViewById(R.id.mapView);
mapView.setSatellite(setSatellite);
mapView.setStreetView(setHybrid);
List<Overlay> mapOverlays = mapView.getOverlays();
for (int i = 0; i < mList.size(); i++) {
Drawable drawable = null;
for (int k = 0; k < ImTracking.pList.size(); k++) {
if (mList.get(i).getId()
.equals(ImTracking.pList.get(k).getid())) {
mList.get(i).setName(
ImTracking.pList.get(k).getName());
if (mList.get(i).getMostRecent()) {
drawable = Maps.this.getResources()
.getDrawable(
pincolorstar[ImTracking.pList
.get(k).getPosition()]);
} else {
drawable = Maps.this
.getResources()
.getDrawable(
ImTracking.pincolors[ImTracking.pList
.get(k).getPosition()]);
}
}
}
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
drawable, mapView);
GeoPoint myPoint = new GeoPoint((int) (mList.get(i)
.getLatitude() * 1E6), (int) (mList.get(i)
.getLongitude() * 1E6));
OverlayItem overlayitem = new OverlayItem(myPoint, mList
.get(i).getName(), mList.get(i).getTime());
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
MapController mc = mapView.getController();
mc.zoomToSpan(Math.abs(maxLat - minLat),
Math.abs(maxLon - minLon));
mc.animateTo(new GeoPoint((maxLat + minLat) / 2,
(maxLon + minLon) / 2));
} catch (Exception e) {
e.printStackTrace();
}
progressDialog.dismiss();
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = Prog开发者_JS百科ressDialog.show(Maps.this, "",
"Updating Data...");
}
}
Thanks for your help
Your exception would not appear to have anything to do with the overlays, but rather with some problem retrieving map tiles from the Google Maps server. Here is a sample project demonstrating both MyLocationOverlay
(for the compass rose) and a custom overlay.
精彩评论