title: How to Integrate Google Maps in Android App
body: <p>I want to integrate the Google Maps for locating user input address in google maps android api v2 with geocoding api with my Android Application</p>
  
  <p>Below is my code:</p>
  
  <blockquote>
    <p>MainActivity.java</p>
  </blockquote>
  
  <pre><code>package com.example.googlemaps;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.UnsupportedEncodingException;
  import java.net.HttpURLConnection;
  import java.net.URL;
  import java.net.URLEncoder;
  import java.util.HashMap;
  import java.util.List;
  
  import org.json.JSONObject;
  
  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.Button;
  import android.widget.EditText;
  import android.widget.Toast;
  
  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 {
  
  
      Button mBtnFind;
      GoogleMap mMap;
      EditText etPlace;
  
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          // Getting reference to the find button
          mBtnFind = (Button) findViewById(R.id.btn_show);
  
          // Getting reference to the SupportMapFragment
          SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
  
          // Getting reference to the Google Map
          mMap = mapFragment.getMap();
  
          // Getting reference to EditText
          etPlace = (EditText) findViewById(R.id.et_place);
  
          // Setting click event listener for the find button
          mBtnFind.setOnClickListener(new OnClickListener() {
  
              @Override
              public void onClick(View v) {   
                  // Getting the place entered 
                  String location = etPlace.getText().toString();
  
                  if(location==null || location.equals("")){
                      Toast.makeText(getBaseContext(), "No Place is entered", Toast.LENGTH_SHORT).show();
                      return;
                  }
  
                  String url = "https://maps.googleapis.com/maps/api/geocode/json?";                  
  
                  try {
                      // encoding special characters like space in the user input place
                      location = URLEncoder.encode(location, "utf-8");
                  } catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }
  
                  String address = "address=" + location;
  
                  String sensor = "sensor=false";
  
  
                  // url , from where the geocoding data is fetched
                  url = url + address + "&amp;" + sensor;
  
                  // Instantiating DownloadTask to get places from Google Geocoding service
                  // in a non-ui thread
                  DownloadTask downloadTask = new DownloadTask();
  
                  // Start downloading the geocoding places
                  downloadTask.execute(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 Places from Geocoding webservice */
      private class DownloadTask extends AsyncTask&lt;String, Integer, String&gt;{
  
              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){
  
                      // Instantiating ParserTask which parses the json data from Geocoding webservice
                      // in a non-ui thread
                      ParserTask parserTask = new ParserTask();
  
                      // Start parsing the places in JSON format
                      // Invokes the "doInBackground()" method of the class ParseTask
                      parserTask.execute(result);
              }
  
      }
  
      /** A class to parse the Geocoding Places in non-ui thread */
      class ParserTask extends AsyncTask&lt;String, Integer, List&lt;HashMap&lt;String,String&gt;&gt;&gt;{
  
          JSONObject jObject;
  
          // Invoked by execute() method of this object
          @Override
          protected List&lt;HashMap&lt;String,String&gt;&gt; doInBackground(String... jsonData) {
  
              List&lt;HashMap&lt;String, String&gt;&gt; places = null;            
              GeocodeJSONParser parser = new GeocodeJSONParser();
  
              try{
                  jObject = new JSONObject(jsonData[0]);
  
                  /** Getting the parsed data as a an ArrayList */
                  places = parser.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&lt;HashMap&lt;String,String&gt;&gt; list){            
  
              // Clears all the existing markers          
              mMap.clear();
  
              for(int i=0;i&lt;list.size();i++){
  
                  // Creating a marker
                  MarkerOptions markerOptions = new MarkerOptions();
  
                  // Getting a place from the places list
                  HashMap&lt;String, String&gt; 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("formatted_address");
  
                  LatLng latLng = new LatLng(lat, lng);
  
                  // Setting the position for the marker
                  markerOptions.position(latLng);
  
                  // Setting the title for the marker
                  markerOptions.title(name);
  
                  // Placing a marker on the touched position
                  mMap.addMarker(markerOptions);    
  
                  // Locate the first location
                  if(i==0)
                      mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
              }            
          }
      }
  
  
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
      }
  }
  </code></pre>
  
  <blockquote>
    <p>GeoCodeJSONParser.java</p>
  </blockquote>
  
  <pre><code>package com.example.googlemaps;
  
  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 GeocodeJSONParser {
  
      /** Receives a JSONObject and returns a list */
      public List&lt;HashMap&lt;String,String&gt;&gt; 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&lt;HashMap&lt;String, String&gt;&gt; getPlaces(JSONArray jPlaces){
          int placesCount = jPlaces.length();
          List&lt;HashMap&lt;String, String&gt;&gt; placesList = new ArrayList&lt;HashMap&lt;String,String&gt;&gt;();
          HashMap&lt;String, String&gt; place = null;   
  
          /** Taking each place, parses and adds to list object */
          for(int i=0; i&lt;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&lt;String, String&gt; getPlace(JSONObject jPlace){
  
          HashMap&lt;String, String&gt; place = new HashMap&lt;String, String&gt;();
          String formatted_address = "-NA-";      
          String lat="";
          String lng="";
  
  
          try {
              // Extracting formatted address, if available
              if(!jPlace.isNull("formatted_address")){
                  formatted_address = jPlace.getString("formatted_address");
              }           
  
              lat = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
              lng = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");          
  
  
              place.put("formatted_address", formatted_address);          
              place.put("lat", lat);
              place.put("lng", lng);
  
  
          } catch (JSONException e) {         
              e.printStackTrace();
          }       
          return place;
      }
  }
  </code></pre>
  
  <blockquote>
    <p>activity_main.xml</p>
  </blockquote>
  
  <pre><code>&lt;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" &gt;
  
      &lt;Button 
          android:id="@+id/btn_show"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/find"
          android:layout_alignParentRight="true"                
          android:layout_alignParentTop="true" /&gt;
  
      &lt;EditText 
          android:id="@+id/et_place"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:hint="@string/hint"
          android:inputType="text" 
          android:layout_toLeftOf="@id/btn_show" /&gt;
  
      &lt;fragment 
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_below="@id/et_place"
          class="com.google.android.gms.maps.SupportMapFragment" /&gt;
  
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <blockquote>
    <p>AndroidManifest.XML</p>
  </blockquote>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.googlemaps"
      android:versionCode="1"
      android:versionName="1.0" &gt;
  
      &lt;uses-sdk
          android:minSdkVersion="8"
          android:targetSdkVersion="17" /&gt;
  
      &lt;permission
            android:name="com.example.googlemaps.permission.MAPS_RECEIVE"
            android:protectionLevel="signature"/&gt;
  
      &lt;uses-permission android:name="com.example.googlemaps.permission.MAPS_RECEIVE"/&gt;
  
      &lt;uses-permission android:name="android.permission.INTERNET"/&gt;
      &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&gt;
      &lt;uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/&gt;
      &lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&gt;
      &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&gt;
  
      &lt;uses-feature
          android:glEsVersion="0x00020000"
          android:required="true"/&gt;    
  
      &lt;application
          android:allowBackup="true"
          android:icon="@drawable/ic_launcher"
          android:label="@string/app_name"
          android:theme="@style/AppTheme" &gt;
          &lt;activity
              android:name="com.example.googlemaps.MainActivity"
              android:label="@string/app_name" &gt;
              &lt;intent-filter&gt;
                  &lt;action android:name="android.intent.action.MAIN" /&gt;
  
                  &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
              &lt;/intent-filter&gt;
          &lt;/activity&gt;
  
          &lt;meta-data
              android:name="com.google.android.maps.v2.API_KEY"
              android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"/&gt;    
  
  
      &lt;/application&gt;
  
  &lt;/manifest&gt;
  </code></pre>
  
  <p>I am getting an error that </p>
  
  <pre><code>Caused by: java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value.  Expected 6111000 but found 0.  You must have the following declaration within the &lt;application&gt; element:     &lt;meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /&gt;
  </code></pre>
  
  <p>Please Help.</p>
  
  <p>Thanks in advance.</p>