2013-07-03 85 views
0

我努力在我的應用中整合谷歌地圖。我不知何故設法顯示地圖與用戶的位置和附近的位置,但位置不更新...我已經通過代碼幾次,但沒有發現一個不正確的命令.. plz幫我排序出來..使用谷歌地圖不更新的位置apiv2

NearbyPlacesActivity -

package com.example.travelplanner; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
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 android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Toast; 

/* 
* MyMapActivity class forms part of Map application 
* in Mobiletuts+ tutorial series: 
* Using Google Maps and Google Places in Android Apps 
* 
* This version of the class is for the final part of the series. 
* 
* Sue Smith 
* March/ April 2013 
*/ 
public class NearbyPlacesActivity extends Activity implements LocationListener { 

    //instance variables for Marker icon drawable resources 
    private int userIcon, foodIcon, drinkIcon, shopIcon, otherIcon; 

    //the map 
    private GoogleMap theMap; 

    //location manager 
    private LocationManager locMan; 

    //user marker 
    private Marker userMarker; 

    //places of interest 
    private Marker[] placeMarkers; 
    //max 
    private final int MAX_PLACES = 20;//most returned from google 
    //marker options 
    private MarkerOptions[] places; 

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

     //get drawable IDs 
     userIcon = R.drawable.yellow_point; 
     foodIcon = R.drawable.red_point; 
     drinkIcon = R.drawable.blue_point; 
     shopIcon = R.drawable.green_point; 
     otherIcon = R.drawable.purple_point; 

     //find out if we already have it 
     if(theMap==null){ 
      //get the map 
      theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap(); 
      //check in case map/ Google Play services not available 
      if(theMap!=null){ 
       //ok - proceed 
       theMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
       //create marker array 
       placeMarkers = new Marker[MAX_PLACES]; 
       //update location 
       updatePlaces(); 
      } 

     } 
    } 

    //location listener functions 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.v("MyMapActivity", "location changed"); 
     updatePlaces(); 
    } 
    @Override 
    public void onProviderDisabled(String provider){ 
     Log.v("MyMapActivity", "provider disabled"); 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
     Log.v("MyMapActivity", "provider enabled"); 
    } 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     Log.v("MyMapActivity", "status changed"); 
    } 

    /* 
    * update the place markers 
    */ 
    private void updatePlaces(){ 
     //get location manager 
     locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     //get last location 
     Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     double lat = lastLoc.getLatitude(); 
     double lng = lastLoc.getLongitude(); 
     Toast.makeText(getApplicationContext(), lat+","+lng, Toast.LENGTH_LONG).show(); 
     //create LatLng 
     LatLng lastLatLng = new LatLng(lat, lng); 

     //remove any existing marker 
     if(userMarker!=null) userMarker.remove(); 
     //create and set marker properties 
     userMarker = theMap.addMarker(new MarkerOptions() 
     .position(lastLatLng) 
     .title("You are here") 
     .icon(BitmapDescriptorFactory.fromResource(userIcon)) 
     .snippet("Your last recorded location")); 
     //move to location 
     theMap.animateCamera(CameraUpdateFactory.newLatLng(lastLatLng), 3000, null); 

     //build places query string 
     String placesSearchStr = "https://maps.googleapis.com/maps/api/place/nearbysearch/" + 
       "json?location="+lat+","+lng+ 
       "&radius=7000&sensor=true" + 
       "&types=food|bar|movie_theater|museum|bank"+ 
       "&key=AIzaSyBqDgqbxFenOtooTivY5YSsJ2JrwBK42hw";//ADD KEY 

     //execute query 
     new GetPlaces().execute(placesSearchStr);  
     locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 100, this); 
    } 

    private class GetPlaces extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... placesURL) { 
      //fetch places 

      //build result as string 
      StringBuilder placesBuilder = new StringBuilder(); 
      //process search parameter string(s) 
      for (String placeSearchURL : placesURL) { 
       HttpClient placesClient = new DefaultHttpClient(); 
       try { 
        //try to fetch the data 

        //HTTP Get receives URL string 
        HttpGet placesGet = new HttpGet(placeSearchURL); 
        //execute GET with Client - return response 
        HttpResponse placesResponse = placesClient.execute(placesGet); 
        //check response status 
        StatusLine placeSearchStatus = placesResponse.getStatusLine(); 
        //only carry on if response is OK 
        if (placeSearchStatus.getStatusCode() == 200) { 
         //get response entity 
         HttpEntity placesEntity = placesResponse.getEntity(); 
         //get input stream setup 
         InputStream placesContent = placesEntity.getContent(); 
         //create reader 
         InputStreamReader placesInput = new InputStreamReader(placesContent); 
         //use buffered reader to process 
         BufferedReader placesReader = new BufferedReader(placesInput); 
         //read a line at a time, append to string builder 
         String lineIn; 
         while ((lineIn = placesReader.readLine()) != null) { 
          placesBuilder.append(lineIn); 
         } 
        } 
       } 
       catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
      return placesBuilder.toString(); 
     } 
     //process data retrieved from doInBackground 
     protected void onPostExecute(String result) { 
      //parse place data returned from Google Places 
      //remove existing markers 
      if(placeMarkers!=null){ 
       for(int pm=0; pm<placeMarkers.length; pm++){ 
        if(placeMarkers[pm]!=null) 
         placeMarkers[pm].remove(); 
       } 
      } 
      try { 
       //parse JSON 

       //create JSONObject, pass stinrg returned from doInBackground 
       JSONObject resultObject = new JSONObject(result); 
       //get "results" array 
       JSONArray placesArray = resultObject.getJSONArray("results"); 
       //marker options for each place returned 
       places = new MarkerOptions[placesArray.length()]; 
       //loop through places 
       for (int p=0; p<placesArray.length(); p++) { 
        //parse each place 
        //if any values are missing we won't show the marker 
        boolean missingValue=false; 
        LatLng placeLL=null; 
        String placeName=""; 
        String vicinity=""; 
        int currIcon = otherIcon; 
        try{ 
         //attempt to retrieve place data values 
         missingValue=false; 
         //get place at this index 
         JSONObject placeObject = placesArray.getJSONObject(p); 
         //get location section 
         JSONObject loc = placeObject.getJSONObject("geometry") 
           .getJSONObject("location"); 
         //read lat lng 
         placeLL = new LatLng(Double.valueOf(loc.getString("lat")), 
           Double.valueOf(loc.getString("lng"))); 
         //get types 
         JSONArray types = placeObject.getJSONArray("types"); 
         //loop through types 
         for(int t=0; t<types.length(); t++){ 
          //what type is it 
          String thisType=types.get(t).toString(); 
          //check for particular types - set icons 
          if(thisType.contains("food")){ 
           currIcon = foodIcon; 
           break; 
          } 
          else if(thisType.contains("bar")){ 
           currIcon = drinkIcon; 
           break; 
          } 
          else if(thisType.contains("movie_theater")){ 
           currIcon = shopIcon; 
           break; 
          } 
         } 
         //vicinity 
         vicinity = placeObject.getString("vicinity"); 
         //name 
         placeName = placeObject.getString("name"); 
        } 
        catch(JSONException jse){ 
         Log.v("PLACES", "missing value"); 
         missingValue=true; 
         jse.printStackTrace(); 
        } 
        //if values missing we don't display 
        if(missingValue) places[p]=null; 
        else 
         places[p]=new MarkerOptions() 
        .position(placeLL) 
        .title(placeName) 
        .icon(BitmapDescriptorFactory.fromResource(currIcon)) 
        .snippet(vicinity); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if(places!=null && placeMarkers!=null){ 
       for(int p=0; p<places.length && p<placeMarkers.length; p++){ 
        //will be null if a value was missing 
        if(places[p]!=null) 
         placeMarkers[p]=theMap.addMarker(places[p]); 

      } 

     } 
    } 
} 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(theMap!=null){ 
      locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 100, this); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(theMap!=null){ 
      locMan.removeUpdates(this); 
     } 
    } 
} 

logcat中沒有錯誤。該清單是準確的,因爲我的關切... API密鑰也是正確的..

還有一件事我想知道....我怎樣才能顯示一個特定的城市的地圖通過點擊按鈕以前的活動..例如:在活動之一,我在edittext中鍵入紐約,並點擊按鈕,它打開活動二包含地圖和指向紐約市...我也想通過不同的標記顯示在紐約的旅遊景點.. ..可有人告訴我提前

爲this..thanks的方式或嘖嘖這是修改後的代碼按你的指導..

package com.example.travelplanner; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URLEncoder; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
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 android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Toast; 

/* 
* MyMapActivity class forms part of Map application 
* in Mobiletuts+ tutorial series: 
* Using Google Maps and Google Places in Android Apps 
* 
* This version of the class is for the final part of the series. 
* 
* Sue Smith 
* March/ April 2013 
*/ 
public class NearbyPlacesActivity extends Activity implements LocationListener { 

    //instance variables for Marker icon drawable resources 
    private int userIcon, foodIcon, drinkIcon, shopIcon, otherIcon; 

    //the map 
    private GoogleMap theMap; 

    //location manager 
    private LocationManager locMan; 

    //user marker 
    private Marker userMarker; 

    //places of interest 
    private Marker[] placeMarkers; 
    //max 
    private final int MAX_PLACES = 20;//most returned from google 
    //marker options 
    private MarkerOptions[] places; 

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

     //get drawable IDs 
     userIcon = R.drawable.yellow_point; 
     foodIcon = R.drawable.red_point; 
     drinkIcon = R.drawable.blue_point; 
     shopIcon = R.drawable.green_point; 
     otherIcon = R.drawable.purple_point; 

     //find out if we already have it 
     if(theMap==null){ 
      //get the map 
      theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap(); 
      //check in case map/ Google Play services not available 
      if(theMap!=null){ 
       //ok - proceed 
       theMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
       //create marker array 
       placeMarkers = new Marker[MAX_PLACES]; 

      } 

     } 
    } 

    //location listener functions 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.v("MyMapActivity", "location changed"); 
     updatePlaces(location); 
    } 
    @Override 
    public void onProviderDisabled(String provider){ 
     Log.v("MyMapActivity", "provider disabled"); 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
     Log.v("MyMapActivity", "provider enabled"); 
    } 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     Log.v("MyMapActivity", "status changed"); 
    } 

    /* 
    * update the place markers 
    */ 
    private void updatePlaces(Location givenlocation){ 
     //get location manager 
     double lat = givenlocation.getLatitude(); 
     double lng = givenlocation.getLongitude(); 
     Toast.makeText(getApplicationContext(), lat+","+lng, Toast.LENGTH_LONG).show(); 
     //create LatLng 
     LatLng lastLatLng = new LatLng(lat, lng); 

     //remove any existing marker 
     if(userMarker!=null) userMarker.remove(); 
     //create and set marker properties 
     userMarker = theMap.addMarker(new MarkerOptions() 
     .position(lastLatLng) 
     .title("You are here") 
     .icon(BitmapDescriptorFactory.fromResource(userIcon)) 
     .snippet("Your last recorded location")); 
     //move to location 
     theMap.animateCamera(CameraUpdateFactory.newLatLng(lastLatLng), 3000, null); 

     //build places query string 
     @SuppressWarnings("deprecation") 
     String encodedstr = URLEncoder.encode("food|bar|movie_theater|museum|bank"); 
     String placesSearchStr = "https://maps.googleapis.com/maps/api/place/nearbysearch/" + 
       "json?location="+lat+","+lng+ 
       "&radius=7000&sensor=true"+ 
       "&types="+encodedstr+ 
       "&key=AIzaSyBqDgqbxFenOtooTivY5YSsJ2JrwBK42hw";//ADD KEY 

     //execute query 
     new GetPlaces().execute(placesSearchStr);  
     locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 100, this); 
    } 

    private class GetPlaces extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... placesURL) { 
      //fetch places 

      //build result as string 
      StringBuilder placesBuilder = new StringBuilder(); 
      //process search parameter string(s) 
      for (String placeSearchURL : placesURL) { 
       HttpClient placesClient = new DefaultHttpClient(); 
       try { 
        //try to fetch the data 

        //HTTP Get receives URL string 
        HttpGet placesGet = new HttpGet(placeSearchURL); 
        //execute GET with Client - return response 
        HttpResponse placesResponse = placesClient.execute(placesGet); 
        //check response status 
        StatusLine placeSearchStatus = placesResponse.getStatusLine(); 
        //only carry on if response is OK 
        if (placeSearchStatus.getStatusCode() == 200) { 
         //get response entity 
         HttpEntity placesEntity = placesResponse.getEntity(); 
         //get input stream setup 
         InputStream placesContent = placesEntity.getContent(); 
         //create reader 
         InputStreamReader placesInput = new InputStreamReader(placesContent); 
         //use buffered reader to process 
         BufferedReader placesReader = new BufferedReader(placesInput); 
         //read a line at a time, append to string builder 
         String lineIn; 
         while ((lineIn = placesReader.readLine()) != null) { 
          placesBuilder.append(lineIn); 
         } 
        } 
       } 
       catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
      return placesBuilder.toString(); 
     } 
     //process data retrieved from doInBackground 
     protected void onPostExecute(String result) { 
      //parse place data returned from Google Places 
      //remove existing markers 
      if(placeMarkers!=null){ 
       for(int pm=0; pm<placeMarkers.length; pm++){ 
        if(placeMarkers[pm]!=null) 
         placeMarkers[pm].remove(); 
       } 
      } 
      try { 
       //parse JSON 

       //create JSONObject, pass stinrg returned from doInBackground 
       JSONObject resultObject = new JSONObject(result); 
       //get "results" array 
       JSONArray placesArray = resultObject.getJSONArray("results"); 
       //marker options for each place returned 
       places = new MarkerOptions[placesArray.length()]; 
       //loop through places 
       for (int p=0; p<placesArray.length(); p++) { 
        //parse each place 
        //if any values are missing we won't show the marker 
        boolean missingValue=false; 
        LatLng placeLL=null; 
        String placeName=""; 
        String vicinity=""; 
        int currIcon = otherIcon; 
        try{ 
         //attempt to retrieve place data values 
         missingValue=false; 
         //get place at this index 
         JSONObject placeObject = placesArray.getJSONObject(p); 
         //get location section 
         JSONObject loc = placeObject.getJSONObject("geometry") 
           .getJSONObject("location"); 
         //read lat lng 
         placeLL = new LatLng(Double.valueOf(loc.getString("lat")), 
           Double.valueOf(loc.getString("lng"))); 
         //get types 
         JSONArray types = placeObject.getJSONArray("types"); 
         //loop through types 
         for(int t=0; t<types.length(); t++){ 
          //what type is it 
          String thisType=types.get(t).toString(); 
          //check for particular types - set icons 
          if(thisType.contains("food")){ 
           currIcon = foodIcon; 
           break; 
          } 
          else if(thisType.contains("bar")){ 
           currIcon = drinkIcon; 
           break; 
          } 
          else if(thisType.contains("movie_theater")){ 
           currIcon = shopIcon; 
           break; 
          } 
         } 
         //vicinity 
         vicinity = placeObject.getString("vicinity"); 
         //name 
         placeName = placeObject.getString("name"); 
        } 
        catch(JSONException jse){ 
         Log.v("PLACES", "missing value"); 
         missingValue=true; 
         jse.printStackTrace(); 
        } 
        //if values missing we don't display 
        if(missingValue) places[p]=null; 
        else 
         places[p]=new MarkerOptions() 
        .position(placeLL) 
        .title(placeName) 
        .icon(BitmapDescriptorFactory.fromResource(currIcon)) 
        .snippet(vicinity); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if(places!=null && placeMarkers!=null){ 
       for(int p=0; p<places.length && p<placeMarkers.length; p++){ 
        //will be null if a value was missing 
        if(places[p]!=null) 
         placeMarkers[p]=theMap.addMarker(places[p]); 

      } 

     } 
    } 
} 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(theMap!=null){ 
      //get location manager 
     locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     //get last location 
     Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 100, this); 
     updatePlaces(lastLoc); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(theMap!=null){ 
      locMan.removeUpdates(this); 
     } 
    } 
} 

請檢查它...它沒有更新我的位置...雖然它的showinng附近的位置..感謝提前

+1

只需使用'theMap.setOnMyLocationChangeListener(this);'並且您使用地圖的位置監聽器 – tyczj

+0

要將地圖設置爲給定城市的特定位置作爲String,您可能需要查看Geocoder類,特別是它的getFromLocationName( )。 – Emmanuel

+0

即時通訊完全困惑的傢伙...我明白你的意思是@tyczj,但你可以PLZ編輯我的代碼,因爲我可能不會做得完美,因爲你會...請求其請求...任何幫助,將不勝感激 – Divyang

回答

0

問題似乎是,只要你打電話給onLocationChanged(),你是調用updatePlaces()方法,您可以重新設置您的位置管理器。行locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);將返回位置管理器的新實例,然後您將爲此新位置管理器調用getLastKnownLocation。您的getLastKnownLocation必須返回過期的位置信息,因此您可能沒有看到任何更新。您最終將使用此位置而不是您的更改偵聽器返回的新位置。 你可以像下面的onResume初始化這些並調用updatePlaces:

@Override 
    protected void onResume() { 
     super.onResume(); 
     if(theMap!=null){ 
      //get location manager 
     locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     //get last location 
     Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 30000, 100, this); 
     updatePlaces(lastLoc) 
     } 
    } 

修改locationchanged:

@Override 
    public void onLocationChanged(Location location) { 
     Log.v("MyMapActivity", "location changed"); 
     updatePlaces(location); 
    } 

修改updateplaces:

private void updatePlaces(Location givenlocation){ 

     double lat = givenlocation.getLatitude(); 
     double lng = givenlocation.getLongitude(); 
     Toast.makeText(getApplicationContext(), lat+","+lng, Toast.LENGTH_LONG).show(); 
     //create LatLng 
     LatLng lastLatLng = new LatLng(lat, lng); 

    *****Call further steps using the above location ****** 

目前正在使用的位置API,它是一部分的android平臺。我還建議您可以遷移到新的The Google Location Services API, part of Google Play Services,因爲它可以改進方式處理位置更新和電池保護。

+0

什麼我應該從oncreate方法傳遞updatePlaces()的時候...這是代碼中唯一的錯誤showin .. – Divyang

+0

不要在onCreate中調用。 onResume中的第一次調用就足夠了,onResume將在onCreate調用後始終被調用。 –

+0

ohk ...謝謝...希望我有一個賞金給你...你的答案值得50+賞金 – Divyang