Могу ли я использовать MyLocationOverlay с другим оверлеем? - PullRequest
1 голос
/ 03 сентября 2011

в моем приложении у меня есть наложение выводов, которое отмечает интересную точку. Я также хочу показать текущее местоположение пользователей, используя mylocationoverlay. Однако, когда я пытаюсь объединить два, я получаю эту ошибку из своей трассировки стека, и она вылетает, когда я запускаю ее на своем телефоне

    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)

Вот код, который я использую. У меня есть mylocationoverlay, созданный в методе oncreate, и у меня есть другой оверлей, созданный в асинхронной задаче перезагрузки

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 = ProgressDialog.show(Maps.this, "",
                    "Updating Data...");
        }
    }

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 04 сентября 2011

Похоже, что ваше исключение не имеет ничего общего с наложениями, а скорее связано с некоторыми проблемами при получении фрагментов карты с сервера Карт Google. Вот пример проекта , демонстрирующий как MyLocationOverlay (для розы компаса), так и пользовательское наложение.

...