Google Places LogoGeocoding, Google places API, Parsing Json, http request

Le but de ce tuto est de voir le parsing d’un fichier JSON récupéré à partir d’une requette sur un serveur. Mais nous allons également profiter de ce tuto pour voir rapidement l’API de google, places qui permet d’obtenir différents types de lieux (bar, banque…) autour d’un point donnés. Profitons également de ce tuto pour utiliser la classe geocoder afin de transformer une adresse en un point (lat,long).

Utiliser Google API

 
Obtenir une clé pour le service de google places
https://code.google.com/apis/console/b/0/

Dans l’onglet  API Access  créer un nouveau compte puis récupérer l’API Key.
Dans l’onglet services, activer Places API.

Pour pouvoir récupérer les lieux dans les 500m aux environs d’un point (lat/long), il faut appeler une url de ce type en remplaçant le key par le votre
https://maps.googleapis.com/maps/api/place/search/json?location=48.9344042,2.3535862&radius=500&types=food&sensor=false&key=METTRE ICI VOTRE KEY

A la racine du JSON renvoyé se trouve results. Il va contenir une liste de lieux. A chaque lieu est associé un ensemble d’attributs (id, name…)

 

Création de la vue

Dans le cadre de ce tutoriel nous allons nous contenter de demander à un utilisateur de rentrer une adresse, de sélectionner un type de lieu puis de les afficher à l’écran.
 
Créons le layout :
 
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  >    <EditText android:id="@+id/addr"  android:layout_width="fill_parent"  android:layout_height="wrap_content"/>   <RadioGroup  android:id="@+id/rg1"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:orientation="horizontal">  <RadioButton  android:id="@+id/option1"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="bank"/>  <RadioButton  android:id="@+id/option2"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="bar"/>  <RadioButton  android:id="@+id/option3"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="restaurant"/> </RadioGroup>   <TextView android:id="@+id/maTextView" android:layout_marginTop="25px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center"/>   </LinearLayout>

 

Redéfinition de la méthode Oncreate

Rédéfinition de la méthode OnCreate
publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RadioGroup rgroup = (RadioGroup) findViewById(R.id.rg1);      //On écoute un changement d'évènement sur les boutons radio rgroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { publicvoid onCheckedChanged(RadioGroup group, int checkedId) {    try { //on créé une instance degeocoder Geocoder gc = new Geocoder(JsonParsingActivity.this); EditText adress = (EditText) findViewById(R.id.addr); List<Address> foundAdresses; /*On récupère l'adresse saisie par l'utilisateur Pour ceuxquiontsuiviletutodegéolocalisation,ilpeutetreintéressantdevérifier qu'une adresse a étésaisie,sice n'est pas faitalorsprendrecommeadressela position actuellede l'utilisateur */ String addressInput = adress.getText().toString();  //On récupèreuneliste d'adresse grace à laclassegeocoder foundAdresses = gc.getFromLocationName(addressInput, 5);  //On ne s'interesse qu'à lapremièreadressedelaliste,ilestcependant possible d'afficher à l'utilisateur //unelistedéroulante d'adresse possible pour qu'il sélectionnelabonneadresse Address x = foundAdresses.get(0); //on récupèrela latitude et longitude corréspondante à l'adresse finaldouble lat = x.getLatitude(); finaldouble lng = x.getLongitude();    //on récupère le bouton radio sélectionné RadioButton rb = (RadioButton) findViewById(checkedId); //on demande à gogoleleslieuxavoisinantescorrespondantau type sélectionné par l'utilisateur String places = getPlaces(rb.getText().toString(),lat,lng); StringBuilder builder = new StringBuilder(); try {   //On parse leJsonrenvoyé JSONObject jsonObj = new JSONObject(places);  //l'attribut results estuneliste d'objet jsondonc on lerécupèreavec getJsonArray JSONArray results = jsonObj.getJSONArray("results");   for (int i = 0; i < results.length(); i++) { //Pour chaque jsonObjet du jsonArray results on récupèrelavaleurde l'attribut name builder.append(results.getJSONObject(i).getString("name").toString()).append("\n"); } } catch (Exception e) { e.printStackTrace(); }   ((TextView)findViewById(R.id.maTextView)).setText(builder.toString());  } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }  }  });    }

 

Appel de l’API places de google

API Google
//google limite le nombrederequettes à 1000 tous les 24h pour un api key donné public String getPlaces(String type,double lat,double lng) {   //Url pour la requête String url = "https://maps.googleapis.com/maps/api/place/search/json?location="+lat+","+lng+"&radius=500&types="+type+"&sensor=false&key=AIzaSyA5J_JPOa5jtuXaOgbTeHqmNzh61u54hSs";   StringBuilder builder = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); //200 pour dire que la requette s'est bien déroulée if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } } else { Log.i(JsonParsingActivity.class.toString(), "Erreur de chargement"); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return builder.toString(); }

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.