{"id":310,"date":"2010-09-15T20:48:00","date_gmt":"2010-09-15T20:48:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/android-reverse-geocoding-with-yahoo-api-placefinder.html"},"modified":"2012-10-21T19:19:07","modified_gmt":"2012-10-21T19:19:07","slug":"android-reverse-geocoding-yahoo-api","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html","title":{"rendered":"Android Reverse Geocoding with Yahoo API &#8211; PlaceFinder"},"content":{"rendered":"<p>In my previous tutorial (<a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/android-location-based-services.html\">Android Location Based Services Application \u2013 GPS location<\/a>) I showed you how to retrieve the user&#8217;s current location in the form of latitude and longitude coordinates. Using those coordinates we are going to provide information regarding the user&#8217;s position. For example, we are going to find the street address nearest to a specific point. That process is called <a href=\"http:\/\/en.wikipedia.org\/wiki\/GIS#Reverse_geocoding\">reverse Geocoding<\/a> and it is the reverse process of <a href=\"http:\/\/en.wikipedia.org\/wiki\/Geocoding\">Geocoding<\/a>, which involves finding associated geographic coordinates (often expressed as latitude and longitude) from other geographic data, such as street addresses, or zip codes (postal codes).<\/p>\n<p>For that purpose, we are going to use Yahoo! PlaceFinder, a super cool API for geocoding and reverse geocoding. From the <a href=\"http:\/\/developer.yahoo.com\/geo\/placefinder\/\">official site<\/a>:<\/p>\n<p>\u201cYahoo! PlaceFinder is a geocoding Web service that helps developers make their applications location-aware by converting street addresses or place names into geographic coordinates (and vice versa).\u201d<\/p>\n<p>In order to use the API, you are going to need a <a href=\"http:\/\/developer.yahoo.com\/dashboard\/createKey.html\">key<\/a> (totally free). However, for the purposes of this tutorial, a key is not required. We are going to use the sample request which can be reached <a href=\"http:\/\/where.yahooapis.com\/geocode?q=38.898717,+-77.035974&amp;gflags=R&amp;appid=[yourappidhere]\">here<\/a>. The response is in XML format so an XML parser will be needed. Don&#8217;t worry though, since Android has included XML capabilities in its core API.<\/p>\n<p>Another thing to note is that PlaceFinder is a web API, so in order to be used by an Android application, the device has to be connected to the&#8230; well&#8230; web. Moreover, an HTTP client will have to be used by our application. Again, don&#8217;t worry because the Android API includes <a href=\"http:\/\/hc.apache.org\/httpcomponents-client\/index.html\">Apache&#8217;s HTTP Client<\/a> for that purpose.<\/p>\n<p>So, let&#8217;s get started. We are going to continue from where we left the previous tutorial. Please <a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/android-location-based-services.html\">check it out<\/a> if you haven&#8217;t already read it. You can download the Eclipse project from <a href=\"http:\/\/dl.dropbox.com\/u\/7215751\/JavaCodeGeeks\/AndroidLbsGeocodingTutorial\/AndroidLbsGeocodingProject.zip\">here<\/a>.<\/p>\n<p>First, we add a new <a href=\"http:\/\/developer.android.com\/reference\/android\/widget\/Button.html\">Button<\/a> which will trigger the reverse geocoding procedure. Thus, the \u201cmain.xml\u201d file for the user interface becomes as follows:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    android:orientation=\"vertical\"\r\n    android:layout_width=\"fill_parent\"\r\n    android:layout_height=\"fill_parent\"\r\n    &gt;\r\n&lt;Button\r\n android:id=\"@+id\/retrieve_location_button\" \r\n android:text=\"Retrieve Location\"\r\n android:layout_width=\"wrap_content\" \r\n android:layout_height=\"wrap_content\" \r\n \/&gt;\r\n&lt;Button \r\n android:id=\"@+id\/reverse_geocoding_button\" \r\n android:text=\"Reverse Geocoding\"\r\n android:layout_width=\"wrap_content\" \r\n android:layout_height=\"wrap_content\" \r\n \/&gt;\r\n&lt;\/LinearLayout&gt;\r\n<\/pre>\n<p>The new button gets hooked up with a <a href=\"http:\/\/developer.android.com\/reference\/android\/view\/View.OnClickListener.html\">OnClickListener<\/a> and when it is clicked, the \u201cperformReverseGeocodingInBackground\u201d method is invoked. In that method, the current location is retrieved (as shown in the previous tutorial). A <a href=\"http:\/\/developer.android.com\/reference\/android\/location\/Location.html\">Location<\/a> instance object, named \u201ccurrentLocation\u201d is used in order to store the user&#8217;s latest known location. Then, the reverse geocoding procedure gets started.<\/p>\n<p>Note that the operation will take place in the background, meaning it will execute in a thread other than the main UI thread. This is because Android is very sensitive in <a href=\"http:\/\/developer.android.com\/guide\/practices\/design\/responsiveness.html\">responsiveness issues<\/a>. Fetching data from the internet can be a time consuming operation and we don&#8217;t want to pause the main thread while the HTTP client waits for the data to be downloaded. Also note that stalling the main thread UI for more than five seconds will trigger an \u201cApplication Not Responding\u201d (ANR) dialog, where the user is given the opportunity to kill your application. Not very good. <\/p>\n<p>For that reason, we will execute the data retrieval operation in a new thread, leveraging the Android API. The class that we will use extends the <a href=\"http:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html\">AsyncTask<\/a> and is named \u201cReverseGeocodeLookupTask\u201d. From the official documentation page, \u201cAsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and\/or handlers\u201d.<\/p>\n<p>There are three methods that we will override. First, <a href=\"http:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html#onPreExecute%28%29\">onPreExecute<\/a>, which occurs in the main thread and is generally used for initialization purposes. In our implementation, we use a <a href=\"http:\/\/developer.android.com\/reference\/android\/app\/ProgressDialog.html\">ProgressDialog<\/a> widget to let the user know that some operation is taking place. Second, the <a href=\"http:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html#doInBackground%28Params...%29\">doInBackground<\/a> method, in which a computation is performed on a background thread and a result object (defined by the subclass of this task) is returned.  In our implementation, the XML data are retrieved and parsed (as I will show you in a minute) and we pass back a domain model class named \u201cGeoCodeResult\u201d which is a placeholder for the location data. Third, the <a href=\"http:\/\/developer.android.com\/reference\/android\/os\/AsyncTask.html#onPostExecute%28Result%29\">onPostExecute<\/a>, which also runs on the UI thread and is used for cleanup purposes. In our case, the <a href=\"http:\/\/developer.android.com\/reference\/android\/app\/ProgressDialog.html\">ProgressDialog<\/a> is cancelled and a <a href=\"http:\/\/developer.android.com\/reference\/android\/widget\/Toast.html\">Toast<\/a> notification presents the retrieved data to the user. Incorporating all the above, the code for our main Activity is now the following:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.android.lbs;\r\n\r\nimport android.app.Activity;\r\nimport android.app.ProgressDialog;\r\nimport android.content.Context;\r\nimport android.location.Location;\r\nimport android.location.LocationListener;\r\nimport android.location.LocationManager;\r\nimport android.os.AsyncTask;\r\nimport android.os.Bundle;\r\nimport android.view.View;\r\nimport android.view.View.OnClickListener;\r\nimport android.widget.Button;\r\nimport android.widget.Toast;\r\n\r\nimport com.javacodegeeks.android.lbs.model.GeoCodeResult;\r\nimport com.javacodegeeks.android.lbs.services.GeoCoder;\r\n\r\npublic class LbsGeocodingActivity extends Activity {\r\n    \r\n    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; \/\/ in Meters\r\n    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; \/\/ in Milliseconds\r\n    \r\n    private GeoCoder geoCoder = new GeoCoder();\r\n    \r\n    protected LocationManager locationManager;\r\n    protected Location currentLocation;\r\n\r\n    protected Button retrieveLocationButton;\r\n    protected Button reverseGeocodingButton;\r\n    \r\n    @Override\r\n    public void onCreate(Bundle savedInstanceState) {\r\n        \r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.main);\r\n\r\n        retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);\r\n        reverseGeocodingButton = (Button) findViewById(R.id.reverse_geocoding_button);\r\n        \r\n        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);\r\n        \r\n        locationManager.requestLocationUpdates(\r\n                LocationManager.GPS_PROVIDER, \r\n                MINIMUM_TIME_BETWEEN_UPDATES, \r\n                MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,\r\n                new MyLocationListener()\r\n        );\r\n        \r\n        retrieveLocationButton.setOnClickListener(new OnClickListener() {\r\n            @Override\r\n            public void onClick(View v) {\r\n                showCurrentLocation();\r\n            }\r\n        });\r\n        \r\n        reverseGeocodingButton.setOnClickListener(new OnClickListener() {            \r\n            @Override\r\n            public void onClick(View v) {                \r\n                performReverseGeocodingInBackground();\r\n            }\r\n        });\r\n        \r\n    }    \r\n\r\n    protected void performReverseGeocodingInBackground() {\r\n        showCurrentLocation();\r\n        new ReverseGeocodeLookupTask().execute((Void[])null);\r\n    }\r\n\r\n    protected void showCurrentLocation() {\r\n\r\n        currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);\r\n\r\n        if (currentLocation != null) {\r\n            String message = String.format(\r\n                    \"Current Location \\n Longitude: %1$s \\n Latitude: %2$s\",\r\n                    currentLocation.getLongitude(), currentLocation.getLatitude()\r\n            );\r\n            Toast.makeText(LbsGeocodingActivity.this, message,\r\n                    Toast.LENGTH_LONG).show();\r\n        }\r\n\r\n    }   \r\n\r\n    private class MyLocationListener implements LocationListener {\r\n\r\n        public void onLocationChanged(Location location) {\r\n            String message = String.format(\r\n                    \"New Location \\n Longitude: %1$s \\n Latitude: %2$s\",\r\n                    location.getLongitude(), location.getLatitude()\r\n            );\r\n            Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();\r\n        }\r\n\r\n        public void onStatusChanged(String s, int i, Bundle b) {\r\n            Toast.makeText(LbsGeocodingActivity.this, \"Provider status changed\",\r\n                    Toast.LENGTH_LONG).show();\r\n        }\r\n\r\n        public void onProviderDisabled(String s) {\r\n            Toast.makeText(LbsGeocodingActivity.this,\r\n                    \"Provider disabled by the user. GPS turned off\",\r\n                    Toast.LENGTH_LONG).show();\r\n        }\r\n\r\n        public void onProviderEnabled(String s) {\r\n            Toast.makeText(LbsGeocodingActivity.this,\r\n                    \"Provider enabled by the user. GPS turned on\",\r\n                    Toast.LENGTH_LONG).show();\r\n        }\r\n\r\n    }\r\n    \r\n    public class ReverseGeocodeLookupTask extends AsyncTask &lt;Void, Void, GeoCodeResult&gt; {\r\n        \r\n        private ProgressDialog progressDialog;\r\n\r\n        @Override\r\n        protected void onPreExecute() {\r\n            this.progressDialog = ProgressDialog.show(\r\n                    LbsGeocodingActivity.this,\r\n                    \"Please wait...contacting Yahoo!\", \/\/ title\r\n                    \"Requesting reverse geocode lookup\", \/\/ message\r\n                    true \/\/ indeterminate\r\n            );\r\n        }\r\n\r\n        @Override\r\n        protected GeoCodeResult doInBackground(Void... params) {\r\n            return geoCoder.reverseGeoCode(currentLocation.getLatitude(), currentLocation.getLongitude());\r\n        }\r\n\r\n        @Override\r\n        protected void onPostExecute(GeoCodeResult result) {\r\n            this.progressDialog.cancel();\r\n            Toast.makeText(LbsGeocodingActivity.this, result.toString(), Toast.LENGTH_LONG).show();            \r\n        }\r\n        \r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>In order to keep things simple and separate the application&#8217;s concerns, we are going to use multiple small classes. The main activity uses a GeoCoder service, our custom implementation which uses the Yahoo API. The code for that class is the following:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.android.lbs.services;\r\n\r\nimport com.javacodegeeks.android.lbs.model.GeoCodeResult;\r\n\r\npublic class GeoCoder {\r\n    \r\n    private static final String YAHOO_API_BASE_URL = \"http:\/\/where.yahooapis.com\/geocode?q=%1$s,+%2$s&amp;gflags=R&amp;appid=[yourappidhere]\";\r\n    \r\n    private HttpRetriever httpRetriever = new HttpRetriever();\r\n    private XmlParser xmlParser = new XmlParser();\r\n    \r\n    public GeoCodeResult reverseGeoCode(double latitude, double longitude) {\r\n        \r\n        String url = String.format(YAHOO_API_BASE_URL, String.valueOf(latitude), String.valueOf(longitude));        \r\n        String response = httpRetriever.retrieve(url);\r\n        return xmlParser.parseXmlResponse(response);\r\n        \r\n    }\r\n\r\n}\r\n<\/pre>\n<p>The model object class named GeoCodeResult will be described later. The GeoCoder service uses two others services.<\/p>\n<p>First we have the \u201cHttpRetriever\u201d class which uses the Apache HTTP client API to perform a GET request and retrieve the data from the Yahoo API URL. The code is the following:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.android.lbs.services;\r\n\r\nimport java.io.IOException;\r\n\r\nimport org.apache.http.HttpEntity;\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.client.methods.HttpGet;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\nimport org.apache.http.util.EntityUtils;\r\n\r\nimport android.util.Log;\r\n\r\npublic class HttpRetriever {\r\n    \r\n    private final String TAG = getClass().getSimpleName();\r\n\r\n    private DefaultHttpClient client = new DefaultHttpClient();\r\n\r\n    public String retrieve(String url) {\r\n\r\n        HttpGet get = new HttpGet(url);\r\n\r\n        try {\r\n\r\n            HttpResponse getResponse = client.execute(get);\r\n            HttpEntity getResponseEntity = getResponse.getEntity();\r\n\r\n            if (getResponseEntity != null) {\r\n                String response = EntityUtils.toString(getResponseEntity);\r\n                Log.d(TAG, response);\r\n                return response;\r\n            }\r\n\r\n        } catch (IOException e) {\r\n            e.printStackTrace();\r\n        }\r\n\r\n        return null;\r\n\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Easy stuff here. A <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/impl\/client\/DefaultHttpClient.html\">DefaultHttpClient<\/a> instance is used for the HTTP requests. A <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/client\/methods\/HttpGet.html\">HttpGet<\/a> is used to represent a GET request and is passed as an argument to the <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/impl\/client\/AbstractHttpClient.html#execute%28org.apache.http.client.methods.HttpUriRequest%29\">execute<\/a> method of the client. A <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/HttpResponse.html\">HttpResponse<\/a> is retrieved as a result (in successful operations) and from that we get an <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/HttpEntity.html\">HttpEntity<\/a> object. Finally, the <a href=\"http:\/\/developer.android.com\/reference\/org\/apache\/http\/util\/EntityUtils.html\">EntityUtils<\/a> helper class is used to convert the response to a String and that response is returned to the caller. Note that no control of unsuccessful operations has been implemented, please take care of that if you want something more robust.<\/p>\n<p>Next service to exam is the \u201cXmlParser\u201d class. This uses the existing DOM manipulation classes to perform parsing of the XML response. From the API&#8217;s response (example <a href=\"http:\/\/where.yahooapis.com\/geocode?q=38.898717,+-77.035974&amp;gflags=R&amp;appid=[yourappidhere]\">here<\/a>), we are going to use only the \u201cline1\u201d &#8211; \u201cline4\u201d nodes of the ResultSet\/Result element. The implementation is a typical DOM one, so I will not get into many details. Here is the code:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.android.lbs.services;\r\n\r\nimport java.io.StringReader;\r\n\r\nimport javax.xml.parsers.DocumentBuilder;\r\nimport javax.xml.parsers.DocumentBuilderFactory;\r\n\r\nimport org.w3c.dom.Document;\r\nimport org.w3c.dom.Node;\r\nimport org.w3c.dom.NodeList;\r\nimport org.xml.sax.InputSource;\r\n\r\nimport android.util.Log;\r\n\r\nimport com.javacodegeeks.android.lbs.model.GeoCodeResult;\r\n\r\npublic class XmlParser {\r\n    \r\n    private final String TAG = getClass().getSimpleName();\r\n    \r\n    public GeoCodeResult parseXmlResponse(String response) {\r\n        \r\n        try {\r\n            \r\n            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r\n            DocumentBuilder db = dbf.newDocumentBuilder();\r\n            Document doc = db.parse(new InputSource(new StringReader(response)));\r\n            \r\n            NodeList resultNodes = doc.getElementsByTagName(\"Result\");            \r\n            Node resultNode = resultNodes.item(0);            \r\n            NodeList attrsList = resultNode.getChildNodes();\r\n            \r\n            GeoCodeResult result = new GeoCodeResult();\r\n            \r\n            for (int i=0; i &lt; attrsList.getLength(); i++) {\r\n                \r\n                Node node = attrsList.item(i);                \r\n                Node firstChild = node.getFirstChild();\r\n                \r\n                if (\"line1\".equalsIgnoreCase(node.getNodeName()) &amp;&amp; firstChild!=null) {\r\n                    result.line1 = firstChild.getNodeValue();\r\n                }\r\n                if (\"line2\".equalsIgnoreCase(node.getNodeName()) &amp;&amp; firstChild!=null) {\r\n                    result.line2 = firstChild.getNodeValue();\r\n                }\r\n                if (\"line3\".equalsIgnoreCase(node.getNodeName()) &amp;&amp; firstChild!=null) {\r\n                    result.line3 = firstChild.getNodeValue();\r\n                }\r\n                if (\"line4\".equalsIgnoreCase(node.getNodeName()) &amp;&amp; firstChild!=null) {\r\n                    result.line4 = firstChild.getNodeValue();\r\n                }\r\n            }\r\n            \r\n            Log.d(TAG, result.toString());\r\n            \r\n            return result;\r\n            \r\n        }\r\n        catch (Exception e) {\r\n            e.printStackTrace();\r\n        }\r\n        \r\n        return null;\r\n        \r\n    }\r\n\r\n}\r\n<\/pre>\n<p>In short, we begin from the root element, we travel down to the \u201cResult\u201d node and then we get all this node&#8217;s children. From those, we sort out the elements we care about using the <a href=\"http:\/\/developer.android.com\/reference\/org\/w3c\/dom\/Node.html#getNodeName%28%29\">getNodeName<\/a> method and finally we retrieve the node value using the <a href=\"http:\/\/developer.android.com\/reference\/org\/w3c\/dom\/Node.html#getNodeValue%28%29\">getNodeValue<\/a> method executed against the first child of the node.   The model class is populated accordingly and then returned back. The code for that class is: <\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.android.lbs.model;\r\n\r\npublic class GeoCodeResult {\r\n    \r\n    public String line1;\r\n    public String line2;\r\n    public String line3;\r\n    public String line4;\r\n    \r\n    @Override\r\n    public String toString() {\r\n        \r\n        StringBuilder builder = new StringBuilder();\r\n        builder.append(\"Location:\");\r\n        \r\n        if (line1!=null)\r\n            builder.append(\"-\"+line1);\r\n        if (line2!=null)\r\n            builder.append(\"-\"+line2);\r\n        if (line3!=null)\r\n            builder.append(\"-\"+line3);\r\n        if (line4!=null)\r\n            builder.append(\"-\"+line4);\r\n        \r\n        return builder.toString();\r\n        \r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>The final step is to add the permission required to access the internet, i.e. \u201c<a href=\"http:\/\/developer.android.com\/reference\/android\/Manifest.permission.html#INTERNET\">android.permission.INTERNET<\/a>\u201d.  Launch the emulator using the <a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/android-location-based-services.html\">already created<\/a> \u201cRun Configuration\u201d. Go to the DDMS view and set the coordinates to a known location. I used the ones that the PlaceFinder <a href=\"http:\/\/where.yahooapis.com\/geocode?q=38.898717,+-77.035974&amp;gflags=R&amp;appid=[yourappidhere]\">sample request<\/a> uses in order to make sure that a valid response will be generated.  <a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TI0olzKNDjI\/AAAAAAAAAIo\/-NllpMEhb2w\/s1600\/07-geo-location-controls.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TI0olzKNDjI\/AAAAAAAAAIo\/-NllpMEhb2w\/s320\/07-geo-location-controls.png\" style=\"cursor: pointer;height: 203px;margin: 0px auto 10px;text-align: center;width: 187px\" \/><\/a> Hit \u201cSend\u201d in order to update the user&#8217;s last known location and then click the \u201cReverse Geocoding\u201d button of our application. First, the progress dialog appears, informing us about the background operation that takes place.  <a href=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TI0otodJrpI\/AAAAAAAAAIw\/0RvRB98ODkw\/s1600\/08-progress-dialog.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TI0otodJrpI\/AAAAAAAAAIw\/0RvRB98ODkw\/s320\/08-progress-dialog.png\" style=\"cursor: pointer;height: 320px;margin: 0px auto 10px;text-align: center;width: 215px\" \/><\/a> After the data are retrieved and extracted from the API response, a Toast appears and let us know what the current address is, as shown below:  <a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TI0o2VX3txI\/AAAAAAAAAI4\/I4gOoZ2LV48\/s1600\/09-toast-location-address.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TI0o2VX3txI\/AAAAAAAAAI4\/I4gOoZ2LV48\/s320\/09-toast-location-address.png\" style=\"cursor: pointer;height: 320px;margin: 0px auto 10px;text-align: center;width: 238px\" \/><\/a> That&#8217;s it! You can now build your location-aware applications and test them using the Android emulator. You can find the new version of the Eclipse project <a href=\"http:\/\/dl.dropbox.com\/u\/7215751\/JavaCodeGeeks\/AndroidLbsGeocodingTutorial\/AndroidLbsGeocodingProject_v2.zip\">here<\/a>.  Happy mobile coding!!!  <\/p>\n<div style=\"margin-bottom: 0px;margin-left: 0px;margin-right: 0px;margin-top: 0px\"><strong><i>Related Articles :<\/i><\/strong><\/div>\n<ul>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/10\/android-full-application-tutorial.html\">\u201cAndroid Full Application Tutorial\u201d series<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/android-text-to-speech-application.html\">Android Text-To-Speech Application<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/android-location-based-services.html\">Android Location Based Services Application \u2013 GPS location<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/embracing-android-awesomeness-quick.html\">Install Android OS on your PC with VirtualBox<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/embracing-android-awesomeness-quick.html\">Embracing the Android awesomeness: A quick overview<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user&#8217;s current location in the form of latitude and longitude coordinates. Using those coordinates we are going to provide information regarding the user&#8217;s position. For example, we are going to find the street address nearest to &hellip;<\/p>\n","protected":false},"author":3,"featured_media":256,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[83,93,94,95,92],"class_list":["post-310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android-core","tag-android-tutorial","tag-geocoding","tag-location-based-services","tag-reverse-geocoding","tag-yahoo-placefinder"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user&#039;s current location in the form\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user&#039;s current location in the form\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2010-09-15T20:48:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T19:19:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ilias Tsagklis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ilias Tsagklis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html\"},\"author\":{\"name\":\"Ilias Tsagklis\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\"},\"headline\":\"Android Reverse Geocoding with Yahoo API &#8211; PlaceFinder\",\"datePublished\":\"2010-09-15T20:48:00+00:00\",\"dateModified\":\"2012-10-21T19:19:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html\"},\"wordCount\":1233,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/yahoo-placefinder-logo.jpg\",\"keywords\":[\"Android Tutorial\",\"Geocoding\",\"Location Based Services\",\"Reverse Geocoding\",\"Yahoo! PlaceFinder\"],\"articleSection\":[\"Android Core\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html\",\"name\":\"Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/yahoo-placefinder-logo.jpg\",\"datePublished\":\"2010-09-15T20:48:00+00:00\",\"dateModified\":\"2012-10-21T19:19:07+00:00\",\"description\":\"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user's current location in the form\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/yahoo-placefinder-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/yahoo-placefinder-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/09\\\/android-reverse-geocoding-yahoo-api.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/android\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Android Core\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/android\\\/android-core\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Android Reverse Geocoding with Yahoo API &#8211; PlaceFinder\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\",\"name\":\"Ilias Tsagklis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"caption\":\"Ilias Tsagklis\"},\"description\":\"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.\",\"sameAs\":[\"http:\\\/\\\/www.iliastsagklis.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/iliastsagklis\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/ilias-tsagklis\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks","description":"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user's current location in the form","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html","og_locale":"en_US","og_type":"article","og_title":"Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks","og_description":"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user's current location in the form","og_url":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2010-09-15T20:48:00+00:00","article_modified_time":"2012-10-21T19:19:07+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg","type":"image\/jpeg"}],"author":"Ilias Tsagklis","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Ilias Tsagklis","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html"},"author":{"name":"Ilias Tsagklis","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e"},"headline":"Android Reverse Geocoding with Yahoo API &#8211; PlaceFinder","datePublished":"2010-09-15T20:48:00+00:00","dateModified":"2012-10-21T19:19:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html"},"wordCount":1233,"commentCount":8,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg","keywords":["Android Tutorial","Geocoding","Location Based Services","Reverse Geocoding","Yahoo! PlaceFinder"],"articleSection":["Android Core"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html","url":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html","name":"Android Reverse Geocoding with Yahoo API - PlaceFinder - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg","datePublished":"2010-09-15T20:48:00+00:00","dateModified":"2012-10-21T19:19:07+00:00","description":"In my previous tutorial (Android Location Based Services Application \u2013 GPS location) I showed you how to retrieve the user's current location in the form","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/yahoo-placefinder-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2010\/09\/android-reverse-geocoding-yahoo-api.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Android","item":"https:\/\/www.javacodegeeks.com\/category\/android"},{"@type":"ListItem","position":3,"name":"Android Core","item":"https:\/\/www.javacodegeeks.com\/category\/android\/android-core"},{"@type":"ListItem","position":4,"name":"Android Reverse Geocoding with Yahoo API &#8211; PlaceFinder"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e","name":"Ilias Tsagklis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","caption":"Ilias Tsagklis"},"description":"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.","sameAs":["http:\/\/www.iliastsagklis.com\/","https:\/\/www.linkedin.com\/in\/iliastsagklis"],"url":"https:\/\/www.javacodegeeks.com\/author\/ilias-tsagklis"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=310"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/310\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/256"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}