2015-04-03 2 views
0

Мне нужно разработать приложение с помощью Google Maps на Android, чтобы найти текущее местоположение и найти ближайшую mosjid. я получаю текущее местоположение, если я нажимаю найти кнопку ничего не происходит .. Не показывать близлежащие местаНе найти ближайших мест

package com.soft.mapexample; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONObject; 

import android.app.Dialog; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 


public class MainActivity extends FragmentActivity implements  
LocationListener{                                             

GoogleMap mGoogleMap; 
Spinner mSprPlaceType; 

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

double mLatitude=0; 
double mLongitude=0; 


@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(); 

     // 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=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 
       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; 
}   


/** 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; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_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 

} 
} 

PlaceJSONParser.Java

package com.soft.mapexample; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

public class PlaceJSONParser { 

/** 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

<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="wrap_content" 
    android:layout_height="60dp" 
    android:layout_alignParentTop="true" /> 

<Button 
    android:id="@+id/btn_find" 
    android:layout_width="wrap_content" 
    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" /> 

</RelativeLayout> 

Строка. xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

<string name="app_name">LocationNearby</string> 
<string name="hello_world">Hello world!</string> 
<string name="menu_settings">Settings</string> 
<string name="str_btn_find">Find</string> 

<string-array name="place_type"> 
    <item>airport</item> 
    <item>atm</item> 
    <item>bank</item> 
    <item>bus_station</item>   
    <item>church</item> 
    <item>doctor</item> 
    <item>hospital</item>   
    <item>mosque</item> 
    <item>movie_theater</item> 
    <item>hindu_temple</item> 
    <item>restaurant</item> 
</string-array> 

<string-array name="place_type_name"> 
    <item>Airport</item> 
    <item>ATM</item> 
    <item>Bank</item> 
    <item>Bus Station</item> 
    <item>Church</item> 
    <item>Doctor</item> 
    <item>Hospital</item> 
    <item>Mosque</item> 
    <item>Movie Theater</item> 
    <item>Hindu Temple</item> 
    <item>Restaurant</item> 
</string-array> 

</resources> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.gasoft.mapexample" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 

<permission 
    android:name="com.soft.mapexample.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature"/> 

<uses-permission 
android:name="com.soft.mapexample.permission.MAPS_RECEIVE"/> 

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission 
android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true"/>  

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.soft.mapexample.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

      <meta-data 
android:name="com.google.android.gms.version" 
android:value="@integer/google_play_services_version" /> 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="api_key"/>   

</application> 

</manifest> 

ответ

0

Создать api_key и использовать его в приложении.

вместо sb.append("&key=API_KEY")

sb.append("&key="+CREATED_API_KEY) использования

+0

Я пытался, но все еще получаю тот же вопрос .. –

+0

ли вы следовали документу Google и создали api_key? И снова попробуйте распечатать данные json в logcat. Возможно, есть вероятность, что нет Масджид, доступный в радиусе 5 км от вашего места. – Kunu

+0

, что и я тоже пытался .. вокруг меня есть 10 masjid доступно –

Смежные вопросы