A la lecture de ce titre, vous vous doutez bien que nous allons aborder plusieurs choses pendant ce tuto :

 

  • Obtention d’une clé pour l’api google places
  • Récupération d’un ou plusieurs lieux ( banque, bar … ) dans un périmètre de 500m selon un point donné
  • Utilisation de la classe geocoder pour transformer une adresse en une coordonnée
  • traitement du résultat renvoyé sous forme de Json

 

 

 

 

 

Tout d’abord, afin d’utiliser l’api google places, il nous faut obtenir une clé de service google places, accessible ici :

https://code.google.com/apis/console/b/0/

 

Dans l’onglet Api access, créez un nouveau compte puis récupérer l’api key.

Dans l’onglet Services, activez « Places API« .

 

Pour pouvoir récupérer les lieux dans les 500m aux environs d’un point ( latitude/ longitude ), il faut appeler une url de ce type en remplaçant le key par la vôtre :

 

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, à un lieu est associé des attributs tels que ( id, name … )

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 donc le layout :

 

<?xml version=« 1.0 » encoding=« utf-8 »?>

<LinearLayout xmlns: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 :


 
 

public void 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() {

                    public void onCheckedChanged(RadioGroup group, int checkedId) {

 

                           try {

                                  //on créé une instance de geocoder

                                  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 ceux qui ont suivi le tuto de géolocalisation,il peut etre intéressant de vérifier

                                  qu’une adresse a été saisie,si ce n’est pas fait alors prendre comme adresse la position actuelle de l’utilisateur

                                  */

                                  String addressInput = adress.getText().toString();

                                  //On récupère une liste d’adresse grace à la classe geocoder

                                  foundAdresses = gc.getFromLocationName(addressInput, 5);

                    //On ne s’interesse qu’à la première adresse de la liste,il est cependant possible d’afficher à l’utilisateur

                                  //une liste déroulante d’adresse possible pour qu’il sélectionne la bonne adresse

                                  Address x = foundAdresses.get(0);

                                 //on récupère la latitude et longitude correspondante à l’adresse

                                  final double lat = x.getLatitude();

                                  final double lng = x.getLongitude();

 

                    //on récupère le bouton radio sélectionné

                                  RadioButton rb = (RadioButton) findViewById(checkedId);

                                  //on demande à gogole les lieux avoisinantes correspondant au type sélectionné par l’utilisateur

                                  String  places = getPlaces(rb.getText().toString(),lat,lng);

                                  StringBuilder builder = new StringBuilder();

                                  try {

 

                                         //On parse le Json renvoyé

                                        JSONObject jsonObj = new JSONObject(places);

                                        //l’attribut results est une liste d’objet json donc on le récupère avec getJsonArray

                                        JSONArray results = jsonObj.getJSONArray(« results »);

 

                                        for (int i = 0; i < results.length(); i++) {  

                                               //Pour chaque jsonObjet du jsonArray results on récupère la valeur de 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();

                           }

                    }

             });

 

       }

 

 


On effectue maintenant un appel de l’api places de google :




//google limite le nombre de requettes à 1000 tout les 24h pour un api key donné

       public String getPlaces(String type,double lat,double lng) {

 

             //Url pour la requette

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

       }

 

 

 

 Et c’est ainsi que s’achève notre tuto sur la géolocalisation via google places !

Bon code à tous 😀

 

 

 

 

 

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.