簡體   English   中英

Android Google Maps API v2在地圖上放置標記

[英]Android Google Maps API v2 placing markers on map

通過從數據庫下載位置值,可以在其上放置標記的地圖。 但是僅在激活onResume()之后才在視覺上顯示。 這是放置標記的方法

public void place(){

      for (int i = 0; i<user_sex.length; i++){
            //someone = new MarkerOptions().position(new LatLng(xx[i], yy[i])).title("Вы здесь!");
            if (user_sex[i]==1){

            map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
            list.put(new LatLng(xx[i],yy[i]), i);

            }
            if (user_sex[i]==2){
                //m[i]=map.addMarker(new MarkerOptions().title("Посмотреть").position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
                map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
                list.put(new LatLng(xx[i],yy[i]), i);
            }else{
                if(xx[i]!=0 && yy[i]!=0 && (user_sex[i] < 1)){
                    //m[i]=map.addMarker(new MarkerOptions().title("Посмотреть").position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
                map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
                list.put(new LatLng(xx[i],yy[i]), i);
                }
                }
            //map.addMarker(someone);
        }
  }

但是在這種情況下,我可以看到它們而無需重新啟動活動

CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(x, y)).zoom(16).build();
        map.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));


        place();
        this.onResume();

但是,此決定會帶來管理卡的問題-如果您移動相機,它將返回到該位置,並且在縮放時會返回到縮放(16)。 有解決辦法嗎? 我下面的onResume()

@Override
  protected void onResume(){
      super.onResume();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            1000 * 10, 10, locationListener);
        locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 1000 * 10, 10,
            locationListener);
        checkEnabled();
  }

以及完整的MapActivity類如下:

 package com.pavloid21.vk;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.LinearLayout;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.pavloid21.vk.R;
import com.pavloid21.vk.ProfileActivity;
import com.sbstrm.appirater.Appirater;
import com.startad.lib.SADView;

public class MapActivity extends FragmentActivity{

     SharedPreferences spref, mpref;
     Editor editor;
     Thread thrd;
     boolean flag;
     HttpResponse response = null;
     String token_user;
     int sex;
     long usr;
     long ID;
     static double x, y, lastX, lastY;
     static int count = 0;
     SupportMapFragment mapFragment;
     private LocationManager locationManager;
      GoogleMap map;
      Map<LatLng, Integer> list = new HashMap();
      final String TAG = "myLogs";
      private ProgressDialog pDialog;
      long[] vkIDs;
      int[] user_sex;
      double[] xx;
      double[] yy;
      String[] name;
      String[] m;
      MarkerOptions someone;
      String nm;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        vkIDs = new long[100];
        user_sex = new int[100];
        xx = new double[100];
        yy = new double[100];
        name = new String[100];



        locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

        mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
        map = mapFragment.getMap();
        if (map == null) {
          finish();
          return;
        }


      }

      @Override
      protected void onResume(){
          super.onResume();
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                1000 * 10, 10, locationListener);
            locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 1000 * 10, 10,
                locationListener);
            checkEnabled();
      }

      @Override
      protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(locationListener);
      }

      private LocationListener locationListener = new LocationListener(){
          @Override
            public void onLocationChanged(Location location) {
              showLocation(location);
            }

            @Override
            public void onProviderDisabled(String provider) {
              checkEnabled();
            }

            @Override
            public void onProviderEnabled(String provider) {
              checkEnabled();
              showLocation(locationManager.getLastKnownLocation(provider));



            }
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
              if (provider.equals(LocationManager.GPS_PROVIDER)) {
                  Log.d("loction CHECK","Status: GPS "+ String.valueOf(status));

              } else if (provider.equals(LocationManager.NETWORK_PROVIDER)) {
                  Log.d("loction CHECK","Status: NET "+ String.valueOf(status));
              }
            }
      };

      private void showLocation(Location location) {
            if (location == null)
              return;
            if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                Log.d("loction CHECK","Status: GPS "+ formatLocation(location));

            } else if (location.getProvider().equals(
                LocationManager.NETWORK_PROVIDER)) {
                Log.d("loction CHECK","Status: NET "+ formatLocation(location));
            }

            x = location.getLatitude();
            y = location.getLongitude();


            MarkerOptions marker = new MarkerOptions().position(new LatLng(x, y)).title("Вы здесь!");
            marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));

            Appirater.appLaunched(this);
            map.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){
                @Override
                public void onInfoWindowClick(Marker marker) {

                   if (list.containsKey(marker.getPosition())){
                   int i = list.get(marker.getPosition());

                   Intent intent = new Intent(MapActivity.this,ProfileActivity.class);
                   ProfileActivity.setID(vkIDs[i]);
                   startActivity(intent);

                   }
                }
            });
            if (count < 1) {

              map.addMarker(marker);

              mpref = getSharedPreferences("pref", Context.MODE_PRIVATE);
              flag = mpref.getBoolean("geo", true);

              if(flag == true){
              new Thread(new Runnable() {
                    @Override
                    public void  run(){

                              DefaultHttpClient hc = new DefaultHttpClient();  
                                ResponseHandler<String> res = new BasicResponseHandler();  
                                spref = getSharedPreferences("SETTING", Context.MODE_PRIVATE);

                                if (spref.contains("IDUSER")){
                                usr = spref.getLong("IDUSER", 0);
                                nm = spref.getString("NAME", "");
                                sex = spref.getInt("SEX", 0);
                                //token_user = spref.getString("TOKEN", "");
                                //sex = spref.getInt("SEX", 0);
                                //nm = spref.getString("NAME", "");
                                }
                                HttpGet http;
                                http = new HttpGet("http://hdwallpapers.orisale.ru//set_mylocation.php?vkid="+usr+"&name="+nm+"&sex="+sex+"&x="+ x +"&y="+ y);

                                Log.d("SEX!!!!!!!!!!!!!!!!", ""+sex);
                                try {
                                    String response = hc.execute(http, res);
                                } catch (ClientProtocolException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                }).start();
              } else {}
              Thread getPeopleThrd = new Thread(new Runnable(){
                    @Override
                    public void run(){
                        JSONParser jsonParser = new JSONParser();
                        JSONObject json = jsonParser.getJSONFromUrl("http://hdwallpapers.orisale.ru//get_around.php?&x="+ x +"&y="+ y);

                        JSONArray array = null;
                      try {
                        array = json.getJSONArray("locations");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    for (int i = 0; i < array.length(); i++){
                        try {
                            JSONObject around = array.getJSONObject(i);
                            vkIDs[i] = (around.getLong("vkid"));
                            user_sex[i] = (around.getInt("sex"));
                            xx[i] = (around.getDouble("x"));
                            yy[i] = (around.getDouble("y"));
                            name[i] = around.getString("name");
                            //name[i] = frnd_name(vkIDs[i]);
                            //Log.d("",name[i]);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    }
                });
                getPeopleThrd.start(); 
            count += 1;

            };



            CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(x, y)).zoom(16).build();
            map.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

            //frnd_name(usr);
            place();
            this.onResume();
          }

      public void place(){

          for (int i = 0; i<user_sex.length; i++){
                //someone = new MarkerOptions().position(new LatLng(xx[i], yy[i])).title("Вы здесь!");
                if (user_sex[i]==1){

                map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
                list.put(new LatLng(xx[i],yy[i]), i);

                }
                if (user_sex[i]==2){
                    //m[i]=map.addMarker(new MarkerOptions().title("Посмотреть").position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
                    map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));
                    list.put(new LatLng(xx[i],yy[i]), i);
                }else{
                    if(xx[i]!=0 && yy[i]!=0 && (user_sex[i] < 1)){
                        //m[i]=map.addMarker(new MarkerOptions().title("Посмотреть").position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
                    map.addMarker(new MarkerOptions().title(name[i]).position(new LatLng(xx[i],yy[i])).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)));
                    list.put(new LatLng(xx[i],yy[i]), i);
                    }
                    }
                //map.addMarker(someone);
            }
      }



      private String formatLocation(Location location) {
            if (location == null)
              return "";
            return String.format(
                "Coordinates: lat = %1$.4f, lon = %2$.4f, time = %3$tF %3$tT",
                location.getLatitude(), location.getLongitude(), new Date(
                    location.getTime()));



          }

      private void checkEnabled() {
            Log.d(" ...  ", "Enabled: "+ locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
            Log.d(" ...  ", "Enabled: "+ locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));

                      }


      private void frnd_name(final long vkid){
          ID = vkid;
          Thread getName = new Thread(new Runnable(){
                @Override
                public void run(){
                    JSONParser jsonParser = new JSONParser();
                    JSONObject json = jsonParser.getJSONFromUrl("http://api.vk.com/method/users.get?user_id=" + ID);

                    JSONArray array = null;
                  try {
                    array = json.getJSONArray("response");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                  for (int i = 0; i < array.length(); i++){
                    try {
                        JSONObject around = array.getJSONObject(i);
                        String nameFrnd = around.getString("first_name");
                        nameFrnd = nameFrnd + " " + around.getString("last_name");
                        nm = nameFrnd;
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                  }

                }
            });
          getName.start();
          if (getName.getState() == Thread.State.TERMINATED){
              for (int i = 0; i < name.length; i++){
                  name[i] = nm;
              }
          }

      }   

}

您要在其中添加標記

    private void showLocation(Location location) {
}

您正在從位置監聽器中調用showLocation()方法。

僅當您要求位置管理器提供更新時,才會觸發位置偵聽器,這意味着您需要進行以下聲明...

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
            1000 * 10, 10, locationListener);

由於您正在初始化位置管理器以在onResume方法中提供更新,因此在調用onResume方法之后僅放置標記...

您可以初始化位置管理器以在onStart方法中提供更新

@Override
    protected void onStart() {
        super.onStart();
        mLocationClient.connect();
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        locationManager.requestLocationUpdates(provider, 0, 0, this);
    }

您不需要編寫onResume()方法。

希望這個能對您有所幫助.........!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM