雅虎财经api

在我之前的教程( 基于Android的基于位置的服务应用程序– GPS位置 )中,我向您展示了如何以经度和纬度坐标的形式检索用户的当前位置。 使用这些坐标,我们将提供有关用户位置的信息。 例如,我们将查找最接近特定点的街道地址。 该过程被称为反向地理编码 ,它是的逆过程地理编码 ,其中涉及找到相关联的地理坐标从其他地理数据,例如街道地址(通常表示为纬度和经度),或邮政编码(邮政代码)。

为此,我们将使用Yahoo!。 PlaceFinder,一个超酷的API,用于地理编码和反向地理编码。 从官方网站 :

“雅虎! PlaceFinder是一种地理编码Web服务,可通过将街道地址或地名转换为地理坐标(反之亦然)来帮助开发人员使其应用程序感知位置。”

为了使用API​​,您将需要一个密钥 (完全免费)。 但是,出于本教程的目的,不需要密钥。 我们将使用此处可以到达的示例请求。 响应为XML格式,因此将需要XML解析器。 不过请不要担心,因为Android在其核心API中包含了XML功能。

还要注意的另一件事是,PlaceFinder是一个Web API,因此,要被Android应用程序使用,该设备必须连接到……网络。 此外,我们的应用程序必须使用HTTP客户端。 同样,请不要担心,因为Android API为此包含了Apache的HTTP客户端 。

因此,让我们开始吧。 我们将从上一教程的开头继续。 如果您还没有阅读过,请检查一下。 您可以从此处下载Eclipse项目。

首先,我们添加一个新的Button ,它将触发反向地理编码过程。 因此,用于用户界面的“ main.xml”文件如下所示:

<?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">
<Buttonandroid:id="@+id/retrieve_location_button" android:text="Retrieve Location"android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:id="@+id/reverse_geocoding_button" android:text="Reverse Geocoding"android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>

新按钮与OnClickListener挂钩 ,当单击它时,将调用“ performReverseGeocodingInBackground”方法。 在该方法中,将检索当前位置(如上一教程中所示)。 为了存储用户的最新已知位置,使用了名为“ currentLocation”的Location实例对象。 然后,开始反向地理编码过程。

请注意,该操作将在后台进行,这意味着它将在除主UI线程之外的其他线程中执行。 这是因为Android在响应性问题上非常敏感。 从Internet上获取数据可能是一项耗时的操作,并且我们不想在HTTP客户端等待数据下载时暂停主线程。 还要注意,将主线程UI停顿五秒钟以上将触发“应用程序无响应”(ANR)对话框,在该对话框中,用户有机会杀死您的应用程序。 不是很好。

因此,我们将利用Android API在新线程中执行数据检索操作。 我们将使用的类扩展了AsyncTask,并将其命名为“ ReverseGeocodeLookupTask”。 在官方文档页面上,“ AsyncTask支持正确轻松地使用UI线程。 该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

我们将覆盖三种方法。 首先, onPreExecute ,它出现在主线程中,通常用于初始化目的。 在我们的实现中,我们使用ProgressDialog小部件让用户知道正在执行某些操作。 其次, 返回doInBackground方法,该方法在后台线程上执行计算,并返回结果对象(由此任务的子类定义)。 在我们的实现中,将检索和解析XML数据(稍后我将向您展示),然后我们传回一个名为“ GeoCodeResult”的域模型类,该类是位置数据的占位符。 第三, onPostExecute ,它也运行在UI线程上,用于清理目的。 在我们的案例中,取消了ProgressDialog ,并且Toast通知将检索到的数据呈现给用户。 结合以上所有内容,我们主要活动的代码如下:

package com.javacodegeeks.android.lbs;import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;import com.javacodegeeks.android.lbs.model.GeoCodeResult;
import com.javacodegeeks.android.lbs.services.GeoCoder;public class LbsGeocodingActivity extends Activity {private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Metersprivate static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Millisecondsprivate GeoCoder geoCoder = new GeoCoder();protected LocationManager locationManager;protected Location currentLocation;protected Button retrieveLocationButton;protected Button reverseGeocodingButton;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);reverseGeocodingButton = (Button) findViewById(R.id.reverse_geocoding_button);locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,new MyLocationListener());retrieveLocationButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {showCurrentLocation();}});reverseGeocodingButton.setOnClickListener(new OnClickListener() {            @Overridepublic void onClick(View v) {                performReverseGeocodingInBackground();}});}    protected void performReverseGeocodingInBackground() {showCurrentLocation();new ReverseGeocodeLookupTask().execute((Void[])null);}protected void showCurrentLocation() {currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);if (currentLocation != null) {String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",currentLocation.getLongitude(), currentLocation.getLatitude());Toast.makeText(LbsGeocodingActivity.this, message,Toast.LENGTH_LONG).show();}}   private class MyLocationListener implements LocationListener {public void onLocationChanged(Location location) {String message = String.format("New Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();}public void onStatusChanged(String s, int i, Bundle b) {Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",Toast.LENGTH_LONG).show();}public void onProviderDisabled(String s) {Toast.makeText(LbsGeocodingActivity.this,"Provider disabled by the user. GPS turned off",Toast.LENGTH_LONG).show();}public void onProviderEnabled(String s) {Toast.makeText(LbsGeocodingActivity.this,"Provider enabled by the user. GPS turned on",Toast.LENGTH_LONG).show();}}public class ReverseGeocodeLookupTask extends AsyncTask <Void, Void, GeoCodeResult> {private ProgressDialog progressDialog;@Overrideprotected void onPreExecute() {this.progressDialog = ProgressDialog.show(LbsGeocodingActivity.this,"Please wait...contacting Yahoo!", // title"Requesting reverse geocode lookup", // messagetrue // indeterminate);}@Overrideprotected GeoCodeResult doInBackground(Void... params) {return geoCoder.reverseGeoCode(currentLocation.getLatitude(), currentLocation.getLongitude());}@Overrideprotected void onPostExecute(GeoCodeResult result) {this.progressDialog.cancel();Toast.makeText(LbsGeocodingActivity.this, result.toString(), Toast.LENGTH_LONG).show();            }}}

为了使事情简单并分离应用程序的关注点,我们将使用多个小类。 主要活动使用GeoCoder服务,这是我们使用Yahoo API的自定义实现。 该类的代码如下:

package com.javacodegeeks.android.lbs.services;import com.javacodegeeks.android.lbs.model.GeoCodeResult;public class GeoCoder {private static final String YAHOO_API_BASE_URL = "http://where.yahooapis.com/geocode?q=%1$s,+%2$s&gflags=R&appid=[yourappidhere]";private HttpRetriever httpRetriever = new HttpRetriever();private XmlParser xmlParser = new XmlParser();public GeoCodeResult reverseGeoCode(double latitude, double longitude) {String url = String.format(YAHOO_API_BASE_URL, String.valueOf(latitude), String.valueOf(longitude));        String response = httpRetriever.retrieve(url);return xmlParser.parseXmlResponse(response);}}

稍后将描述名为GeoCodeResult的模型对象类。 GeoCoder服务使用其他两个服务。

首先,我们有一个“ HttpRetriever”类,该类使用Apache HTTP客户端API来执行GET请求并从Yahoo API URL检索数据。 代码如下:

package com.javacodegeeks.android.lbs.services;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;import android.util.Log;public class HttpRetriever {private final String TAG = getClass().getSimpleName();private DefaultHttpClient client = new DefaultHttpClient();public String retrieve(String url) {HttpGet get = new HttpGet(url);try {HttpResponse getResponse = client.execute(get);HttpEntity getResponseEntity = getResponse.getEntity();if (getResponseEntity != null) {String response = EntityUtils.toString(getResponseEntity);Log.d(TAG, response);return response;}} catch (IOException e) {e.printStackTrace();}return null;}}

简单的东西在这里。 DefaultHttpClient实例用于HTTP请求。 HttpGet用于表示GET请求,并作为参数传递给客户端的execute方法。 结果(在成功的操作中)将获得HttpResponse,并从中获得HttpEntity对象。 最后,使用EntityUtils帮助器类将响应转换为String,并将该响应返回给调用方。 请注意,尚未实现对失败操作的控制,如果您想要更强大的功能,请注意这一点。

考试的下一项服务是“ XmlParser”类。 这使用现有的DOM操作类来执行XML响应的解析。 从API的响应( 此处为示例),我们将仅使用ResultSet / Result元素的“ line1”-“ line4”节点。 该实现是一种典型的DOM,因此我将不涉及很多细节。 这是代码:

package com.javacodegeeks.android.lbs.services;import java.io.StringReader;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;import android.util.Log;import com.javacodegeeks.android.lbs.model.GeoCodeResult;public class XmlParser {private final String TAG = getClass().getSimpleName();public GeoCodeResult parseXmlResponse(String response) {try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new InputSource(new StringReader(response)));NodeList resultNodes = doc.getElementsByTagName("Result");            Node resultNode = resultNodes.item(0);            NodeList attrsList = resultNode.getChildNodes();GeoCodeResult result = new GeoCodeResult();for (int i=0; i < attrsList.getLength(); i++) {Node node = attrsList.item(i);                Node firstChild = node.getFirstChild();if ("line1".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line1 = firstChild.getNodeValue();}if ("line2".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line2 = firstChild.getNodeValue();}if ("line3".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line3 = firstChild.getNodeValue();}if ("line4".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line4 = firstChild.getNodeValue();}}Log.d(TAG, result.toString());return result;}catch (Exception e) {e.printStackTrace();}return null;}}

简而言之,我们从根元素开始,向下移动到“结果”节点,然后获得该节点的所有子节点。 从这些中,我们使用getNodeName方法来筛选我们关心的元素,最后使用针对节点的第一个子节点执行的getNodeValue方法来检索节点值。 相应地填充模型类,然后返回。 该类的代码是:

package com.javacodegeeks.android.lbs.model;public class GeoCodeResult {public String line1;public String line2;public String line3;public String line4;@Overridepublic String toString() {StringBuilder builder = new StringBuilder();builder.append("Location:");if (line1!=null)builder.append("-"+line1);if (line2!=null)builder.append("-"+line2);if (line3!=null)builder.append("-"+line3);if (line4!=null)builder.append("-"+line4);return builder.toString();}}

最后一步是添加访问Internet所需的权限,即“ android.permission.INTERNET ”。 使用已经创建的 “运行配置”启动仿真器。 转到DDMS视图,然后将坐标设置为已知位置。 我使用了PlaceFinder 示例请求所使用的请求 ,以确保将生成有效的响应。 点击“发送”以更新用户的最后一个已知位置,然后单击我们应用程序的“反向地理编码”按钮。 首先,出现进度对话框,向我们通知发生的后台操作。 从API响应中检索并提取数据后,将显示Toast,让我们知道当前地址是什么,如下所示: 而已! 现在,您可以构建您的位置感知应用程序,并使用Android模拟器对其进行测试。 您可以在这里找到Eclipse项目的新版本。 快乐的手机编码!!!

相关文章 :
  • “ Android完整应用程序教程”系列
  • Android文字转语音应用
  • Android基于位置的服务应用程序– GPS位置
  • 使用VirtualBox在PC上安装Android OS
  • 拥抱Android的强大功能:快速概览

翻译自: https://www.javacodegeeks.com/2010/09/android-reverse-geocoding-yahoo-api.html

雅虎财经api

雅虎财经api_带有Yahoo API的Android反向地理编码– PlaceFinder相关推荐

  1. android谷歌反地理,Android反向地理编码显示不出来!

    我用google 的Geocoding API 接口来处理反向地理编码 ,但是运行时是空白界面,显示不出位置  下面是代码 ,请告诉我怎么办 public class MainActivity ext ...

  2. 使用Python进行地理编码和反向地理编码

    Geocoding is the process of taking input text, such as an address or the name of a place, and return ...

  3. Google Geocoding API---地理编码与反向地理编码

    什么是地理编码 地理编码是将地址(如"1600 Amphitheatre Parkway, Mountain View, CA")转换为地理坐标(如纬度 37.423021 和经度 ...

  4. 谷歌地图JavaScript API第3版 地理编码服务

    地理编码服务 概观 地理编码请求 地理编码响应 地理编码结果 地址组件类型 状态代码 反向地理编码 视口偏置 区码偏置 概观 地理编码地址(如"1600剧场百汇,山景,CA")转换 ...

  5. Elasticsearch:使用反向地理编码在地图上显示自定义区域统计数据

    在实际的许多应用中,我们可能并不一定按照行政区来进行划分区域,比如我们常说江浙一代,我们可以理解江苏和浙江这两个省合在一起,而不是把它们分开.我们有时也说长江三角区,它可能是跨几个省市的一个区域,而不 ...

  6. 面向初学者的带有MVC API的Android 管理表CRUD MSSQL

    目录 介绍 在Android中使用API​​进行表CRUD 屏幕截图示例 第一节 结论 介绍 我的上一篇文章面向初学者的带MVC API的Angular Js Table CRUD MSSQL和使用S ...

  7. python调用百度地图画轨迹图_[python]百度地图API,正/逆地理编码,路线规划接口的调用,实现输出出行的距离和......

    [Python] 纯文本查看 复制代码''' 文件名:L17.py 作者:小饭团 创建时间:2019年1月11日15:17:03 文件描述:调用Web服务API接口,百度地图路线规划 正/逆地理编码 ...

  8. python调用百度地图实现导航pc_[python]百度地图API,正/逆地理编码,路线规划接口的调用,实现输出出行的距离和......

    [Python] 纯文本查看 复制代码''' 文件名:L17.py 作者:小饭团 创建时间:2019年1月11日15:17:03 文件描述:调用Web服务API接口,百度地图路线规划 正/逆地理编码 ...

  9. python调用百度地图api定位_逆地理编码 rgc 反geo检索 | 百度地图API SDK

    使用方法 如不访问境外POI,走以下服务使用流程 编码说明 API请求中需要用到中文或一些特殊字符的参数,如query.region等,为了避免提交到后台乱码,需要对这几个参数值进行编码处理,转换成U ...

最新文章

  1. Java 调用Oracle的存储过程
  2. XenApp_XenDesktop_7.6实战篇之十五:StoreFront的配置
  3. java bigdecimal语法_JAVA BigDecimal 小数点处理
  4. 给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。
  5. 深度剖析数据库国产化迁移之路
  6. java 图片旋转 翻转 镜像处理_Java OpenCV实现图像镜像翻转效果
  7. Python+socket完美实现TCP长连接保持存活
  8. 华为光伏usb适配器_华为P40无线充电手机壳拆解:1款配件补上22.5W无线快充
  9. SpringBoot启动流程原理+自动装配原理
  10. xml 解析库 msxml6.dll
  11. 【详解】为何三元一次方程可以表示一个平面
  12. 人工智能-----自然语言处理(NLP)基础理解
  13. 音视频技术开发周刊 | 247
  14. Java面向对象高级部分——通过Class类实例化对象(五十二)
  15. ACAD DWG to PDF Converter 9.8.2.4版本更新啦
  16. L9110 L9110S SOP8 马达驱动 IC 芯片 H桥全桥 贴片
  17. 非线性控制理论与模型预测控制MPC-知识总结
  18. 数据安全特点有哪些?现在企业如何保障数据安全?
  19. java-php-python-ssm旅游产品网络销售系统计算机毕业设计
  20. 如何用PowerBI做损益计算书

热门文章

  1. springboot中的线程池
  2. 【Aegisub相关】_G 简化代码写法的有效范围
  3. 《3S新闻周刊》(转帖)
  4. 代码生成工具--动软
  5. Orthogonal Arrays(正交法测试)amp;Pairwise Testing (成对法测试)
  6. PMI-ACP敏捷认证练习题(五)英文版
  7. DevOps到底是什么意思?-小白收藏
  8. eclispe启动报错
  9. 航信 PNR解析详解
  10. nginx反向代理地址是域名时请求不通的情况