0

我想顯示我使用谷歌地圖的地方API的地方的位置。但是我的搜索結果的標記沒有顯示在地圖上。我似乎無法找到問題所在。以下是我的logcat日誌的源代碼的副本。任何幫助將非常感激。先謝謝你 :) 。谷歌地圖地方標記不顯示

我的MainActivity

public class MainActivity extends FragmentActivity implements LocationListener, GoogleMap.OnMapClickListener { 

     GoogleMap mGoogleMap; 
     Spinner mSprPlaceType; 

     String[] mPlaceType=null; 
     String[] mPlaceTypeName=null; 

     double mLatitude=0; 
     double mLongitude=0; 
     LatLng center; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 


      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      // Array of place types 
      mPlaceType = getResources().getStringArray(R.array.place_type); 

      // Array of place type names 
      mPlaceTypeName = getResources().getStringArray(R.array.place_type_name); 

      // Creating an array adapter with an array of Place types 
      // to populate the spinner 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, mPlaceTypeName); 

      // Getting reference to the Spinner 
      mSprPlaceType = (Spinner) findViewById(R.id.spr_place_type); 

      // Setting adapter on Spinner to set place types 
      mSprPlaceType.setAdapter(adapter); 

      Button btnFind; 

      // Getting reference to Find Button 
      btnFind = (Button) findViewById(R.id.btn_find); 


      // Getting Google Play availability status 
      int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 


      if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available 

       int requestCode = 10; 
       Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
       dialog.show(); 

      }else { // Google Play Services are available 

       // Getting reference to the SupportMapFragment 
       SupportMapFragment fragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 


       // Getting Google Map 

       mGoogleMap = fragment.getMap(); 
       mGoogleMap.setOnMapClickListener(this); 
       mGoogleMap.getUiSettings().isCompassEnabled(); 
       mGoogleMap.getUiSettings().setZoomControlsEnabled(true); 
       mGoogleMap.getUiSettings().setScrollGesturesEnabled(true); 
       mGoogleMap.getUiSettings().setMapToolbarEnabled(true); 
       mGoogleMap.setMyLocationEnabled(true); 

       // Enabling MyLocation in Google Map 
       mGoogleMap.setMyLocationEnabled(true); 



       // Getting LocationManager object from System Service LOCATION_SERVICE 
       LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

       // Creating a criteria object to retrieve provider 
       Criteria criteria = new Criteria(); 

       // Getting the name of the best provider 
       String provider = locationManager.getBestProvider(criteria, true); 

       // Getting Current Location From GPS 
       Location location = locationManager.getLastKnownLocation(provider); 

       if(location!=null){ 

        onLocationChanged(location); 

       } 




       locationManager.requestLocationUpdates(provider, 20000, 0, this); 

       // Setting click event lister for the find button 
       btnFind.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 


         int selectedPosition = mSprPlaceType.getSelectedItemPosition(); 
         String type = mPlaceType[selectedPosition]; 


         StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
         sb.append("location="+mLatitude+","+mLongitude); 
         sb.append("&radius=5000"); 
         sb.append("&types="+type); 
         sb.append("&sensor=true"); 
         sb.append("&key=MY_API_KEY"); 


         // Creating a new non-ui thread task to download Google place json data 
         PlacesTask placesTask = new PlacesTask(); 

         // Invokes the "doInBackground()" method of the class PlaceTask 
         Log.d("url",sb.toString()); 
         placesTask.execute(sb.toString()); 


        } 
       }); 

      } 

     } 

     /** A method to download json data from url */ 
     private String downloadUrl(String strUrl) throws IOException{ 
      String data = ""; 
      InputStream iStream = null; 
      HttpURLConnection urlConnection = null; 
      try{ 
       URL url = new URL(strUrl); 


       // Creating an http connection to communicate with url 
       urlConnection = (HttpURLConnection) url.openConnection(); 

       // Connecting to url 
       urlConnection.connect(); 

       // Reading data from url 
       iStream = urlConnection.getInputStream(); 

       BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

       StringBuffer sb = new StringBuffer(); 

       String line = ""; 
       while((line = br.readLine()) != null){ 
        sb.append(line); 
       } 

       data = sb.toString(); 

       br.close(); 

      }catch(Exception e){ 
       Log.d("Exception while downloading url", e.toString()); 
      }finally{ 
       iStream.close(); 
       urlConnection.disconnect(); 
      } 

      return data; 
     } 

     @Override 
     public void onMapClick(LatLng latLng) { 
      center = mGoogleMap.getCameraPosition().target; 
      // Toast.makeText(MainActivity.this, center.toString(), Toast.LENGTH_LONG).show(); 
      mLatitude= center.latitude; 
      mLongitude=center.longitude; 

     } 


     /** A class, to download Google Places */ 
     private class PlacesTask extends AsyncTask<String, Integer, String>{ 

      String data = null; 

      // Invoked by execute() method of this object 
      @Override 
      protected String doInBackground(String... url) { 
       try{ 
        data = downloadUrl(url[0]); 
       }catch(Exception e){ 
        Log.d("Background Task",e.toString()); 
       } 
       return data; 
      } 

      // Executed after the complete execution of doInBackground() method 
      @Override 
      protected void onPostExecute(String result){ 
       ParserTask parserTask = new ParserTask(); 

       // Start parsing the Google places in JSON format 
       // Invokes the "doInBackground()" method of the class ParseTask 
       parserTask.execute(result); 
      } 

     } 

     /** A class to parse the Google Places in JSON format */ 
     private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{ 

      JSONObject jObject; 

      // Invoked by execute() method of this object 
      @Override 
      protected List<HashMap<String,String>> doInBackground(String... jsonData) { 

       List<HashMap<String, String>> places = null; 
       PlaceJSONParser placeJsonParser = new PlaceJSONParser(); 

       try{ 
        jObject = new JSONObject(jsonData[0]); 

        /** Getting the parsed data as a List construct */ 
        places = placeJsonParser.parse(jObject); 

       }catch(Exception e){ 
        Log.d("Exception",e.toString()); 
       } 
       return places; 
      } 

      // Executed after the complete execution of doInBackground() method 
      @Override 
      protected void onPostExecute(List<HashMap<String,String>> list){ 

       // Clears all the existing markers 
       mGoogleMap.clear(); 

       for(int i=0;i<list.size();i++){ 

        // Creating a marker 
        MarkerOptions markerOptions = new MarkerOptions(); 

        // Getting a place from the places list 
        HashMap<String, String> hmPlace = list.get(i); 

        // Getting latitude of the place 
        double lat = Double.parseDouble(hmPlace.get("lat")); 

        // Getting longitude of the place 
        double lng = Double.parseDouble(hmPlace.get("lng")); 

        // Getting name 
        String name = hmPlace.get("place_name"); 

        // Getting vicinity 
        String vicinity = hmPlace.get("vicinity"); 

        LatLng latLng = new LatLng(lat, lng); 

        // Setting the position for the marker 
        markerOptions.position(latLng); 

        // Setting the title for the marker. 
        //This will be displayed on taping the marker 
        markerOptions.title(name + " : " + vicinity); 

        // Placing a marker on the touched position 
        mGoogleMap.addMarker(markerOptions); 

       } 

      } 

     } 



     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu_main; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.menu_main, menu); 
      return true; 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      mLatitude = location.getLatitude(); 
      mLongitude = location.getLongitude(); 
      LatLng latLng = new LatLng(mLatitude, mLongitude); 

      mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
      mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 
    } 

我JSONParser:

public class JSONParser { 

    /** Receives a JSONObject and returns a list */ 
    public List<HashMap<String,String>> parse(JSONObject jObject){ 

     JSONArray jPlaces = null; 
     try { 
      /** Retrieves all the elements in the 'places' array */ 
      jPlaces = jObject.getJSONArray("results"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     /** Invoking getPlaces with the array of json object 
     * where each json object represent a place 
     */ 
     return getPlaces(jPlaces); 
    } 


    private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){ 
     int placesCount = jPlaces.length(); 
     List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>(); 
     HashMap<String, String> place = null; 

     /** Taking each place, parses and adds to list object */ 
     for(int i=0; i<placesCount;i++){ 
      try { 
       /** Call getPlace with place JSON object to parse the place */ 
       place = getPlace((JSONObject)jPlaces.get(i)); 
       placesList.add(place); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

     return placesList; 
    } 

    /** Parsing the Place JSON object */ 
    private HashMap<String, String> getPlace(JSONObject jPlace){ 

     HashMap<String, String> place = new HashMap<String, String>(); 
     String placeName = "-NA-"; 
     String vicinity="-NA-"; 
     String latitude=""; 
     String longitude=""; 


     try { 
      // Extracting Place name, if available 
      if(!jPlace.isNull("name")){ 
       placeName = jPlace.getString("name"); 
      } 

      // Extracting Place Vicinity, if available 
      if(!jPlace.isNull("vicinity")){ 
       vicinity = jPlace.getString("vicinity"); 
      } 

      latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat"); 
      longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng"); 


      place.put("place_name", placeName); 
      place.put("vicinity", vicinity); 
      place.put("lat", latitude); 
      place.put("lng", longitude); 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return place; 
    }} 

我activity_main:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <Spinner 
     android:id="@+id/spr_place_type" 
     android:layout_width="200dp" 
     android:layout_height="60dp" 
     android:gravity="center" 

     /> 

    <Button 
     android:id="@+id/btn_find" 
     android:layout_width="200dp" 
     android:layout_height="60dp" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@id/spr_place_type" 
     android:text="@string/str_btn_find" /> 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/map" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/spr_place_type" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 

    <ImageView 
     android:layout_width="30dp" 
     android:layout_height="50dp" 
     android:id="@+id/imageView" 
     android:src="@drawable/location" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 

而且我的logcat: enter image description here

+0

你試圖在谷歌地圖顯示多個標記? –

+0

@androiddev是的。因爲我正在尋找一個地方類型,例如醫院或Resturant。根據搜索半徑,我可能會得到多個結果。 – 9it3e1

回答

1
private void getParticularTypeLocation(String selType){ 
    StringBuilder googlePlacesUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
    googlePlacesUrl.append("location=" + latitude + "," + longitude); 
    googlePlacesUrl.append("&radius=" + 5000); 
    googlePlacesUrl.append("&types=" + selType); 
    googlePlacesUrl.append("&sensor=true"); 
    googlePlacesUrl.append("&key=" + GOOGLE_API_KEY); 

    GooglePlacesReadTask googlePlacesReadTask = new GooglePlacesReadTask(); 
    Object[] toPass = new Object[2]; 
    toPass[0] = googlePlacesUrl.toString(); 
    toPass[1] = BitmapDescriptorFactory.HUE_VIOLET; 
    googlePlacesReadTask.execute(toPass); 

    MarkerOptions marker = new MarkerOptions().position(
      new LatLng(randomLocation[0], randomLocation[1])) 
      .title("Current Location"); 

    marker.icon(BitmapDescriptorFactory 
      .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); 

    googleMap.addMarker(marker); 

    CameraPosition cameraPosition = new CameraPosition.Builder() 
    .target(new LatLng(randomLocation[0], 
      randomLocation[1])).zoom(13).build(); 
    googleMap.animateCamera(CameraUpdateFactory 
      .newCameraPosition(cameraPosition)); 
} 

您可以參考此代碼,這將獲得谷歌地圖中的relavent地方。

給字符串輸入像醫院,賓館,policestation,公園等類型,

我希望,這可能會幫助你。