Android利用谷歌地图获取并解析经纬度对应的地理位置
最近需要对GPS定位信息进行地理位置解析,看到一些文章里面建议使用百度地图API来做,不过考虑到百度地图在国外的使用体验,还是想试试通过Google地图来进行地理位置获取,闲话不多说,上代码。
首先当然需要检查GPS功能模块以及GPS开启状态,同时在使用GPS时需要考虑到GPS权限请求:
/** * check if it has any gps provider * @return boolean */ public boolean isHasGPSModule(){// TODO Auto-generated method stub LocationManager lmManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (lmManager != null) {List<String> mProviders = lmManager.getAllProviders(); if (mProviders != null && mProviders.contains(LocationManager.GPS_PROVIDER)) {return true; }}return false; }
/** * Check if GPS opened * * @return boolean */ private boolean checkGPSIsOpen() {boolean isOpen; LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE); isOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); return isOpen; }
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
确认GPS处于开启使用后,注册位置监听:
if (isHasGPSModule()) {lmManager = (LocationManager) getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_LOW); criteria.setAltitudeRequired(true); criteria.setBearingRequired(true); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = lmManager.getBestProvider(criteria, true); Log.i("GPS", "bestprovider=" + provider); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; }Location location = lmManager.getLastKnownLocation(provider); if (location != null) {updateWithNewLocation(location); } else {lmManager.requestLocationUpdates(provider, 5000L, 20f, locationListener); showProgressDialog("search location ..."); } }
等待位置更新onLocationChanged:
LocationListener locationListener = new LocationListener() {@Override public void onLocationChanged(Location location) {// TODO Auto-generated method stub Log.i("GPS", "Locationchanged"); dismissProgressDialog(); lmManager.removeUpdates(locationListener); updateWithNewLocation(location); }@Override public void onProviderDisabled(String provider) {// TODO Auto-generated method stub }@Override public void onProviderEnabled(String provider) {// TODO Auto-generated method stub }@Override public void onStatusChanged(String provider, int status, Bundle extras) {// TODO Auto-generated method stub } };
接下来,重点来了,使用得到的location信息去请求位置:
private void updateWithNewLocation(Location location) {Log.i("GPS", "updateLocation"); String latitude = String.valueOf(location.getLatitude()); String longitude = String.valueOf(location.getLongitude()); Log.i("GPS", "updateLocation" + "latitude=" + latitude + "longitude=" + longitude); String url = String.format("http://maps.google.cn/maps/api/geocode/json?latlng=%s,%s&sensor=false&language=en_us", latitude, longitude); //请求的链接是重点,尝试了很多次,默认语言中文,这里由于需要设置成美国英语 sendLocationAdressRequest(url); }
进行网络请求并得到位置信息:
private void sendLocationAdressRequest(String address) {HttpUtil.sendOkHttpRequest(address, new okhttp3.Callback() {@Override public void onResponse(Call call, Response response) throws IOException {if (response != null && !isResponse) {isResponse = true; String responseData = response.body().string(); // get address
showResponse(responseData);
Log.i("GPS", "responseData=" + responseData); } } @Override public void onFailure(Call call, IOException e) { Log.i("GPS", "request address form Google map failure"); } });}
private String showResponse(String response) {JSONObject jsonObj = null; String result = ""; try {// 把服务器相应的字符串转换为JSONObject jsonObj = new JSONObject(response); // 解析出响应结果中的地址数据 JSONArray jsonArray = jsonObj.getJSONArray("results"); Log.i("GPS", "lenth = " + jsonArray.length()); result = jsonArray.getJSONObject(jsonArray.length() - 1).getString("formatted_address"); /*result = jsonObj.getJSONArray(0).getString("formatted_address");*/ // 此处jsonArray.length()-1得到的位置信息是最后一列,得到的是Google地图划分区域的最外层, // 如国家或者特殊城市-香港等,若需要得到具体位置使用0; Log.i("GPS", "address json result = " + result); } catch (JSONException e) {e.printStackTrace(); Log.i("GPS", "address json result error"); }return result; }
在这里主要感谢这两篇文章:http://blog.csdn.net/fulianwu/article/details/6540890 和 http://blog.sina.com.cn/s/blog_4b20ae2e0101b2eo.html
以及郭临大神的《Android第一行代码》中对于okhttp3的工具类的使用:
public class HttpUtil {public static void sendOkHttpRequest(String url, okhttp3.Callback callback){OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(ur).build(); client.newCall(request).enqueue(callback); } }
写到这里简单的定位和地址解析已经完成,可以使用得到的地理位置进行相关的开发。
原创文章,如需转载,请注明出去~
Android利用谷歌地图获取并解析经纬度对应的地理位置相关推荐
- Android 通过高德地图获取地址的经纬度
不废话,需求:输入一个地址,获取到它的经纬度,怎么办? 1.到高德开放平台申请,获取key 高德开放平台:https://lbs.amap.com/ 2.下载高德定位及地址搜索SDK:https:// ...
- python 根据地址求经纬度 谷歌_js获取ip地址利用谷歌地图获得经纬度
js获取ip地址利用谷歌地图获得经纬度-www.jquerycn.cn var massage=null; function userip(ip){ $.getScript("http:/ ...
- 基于Android的谷歌地图地理围栏功能开发
第一步.Android使用谷歌地图权限 Android上使用谷歌地图 必备条件:翻墙.Android设备上安装Google Play Service 由于谷歌在国内已经被墙了,所以我们只能使用翻墙软件 ...
- android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...
Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...
- Android 开源1:获取并解析网页信息(Jsoup)
Android 开源1:获取并解析网页信息(Jsoup) Android 开源1获取并解析网页信息Jsoup 一程序功能 二程序界面 三程序知识点与创新点 四 总结 一.程序功能 本款APP主要是通过 ...
- Android利用Java反射获取用户手机的rom定制系统及版本,EMUI,MIUI,ColorOS,FunthouchOS等
Android利用Java反射获取用户手机的rom定制系统版本及版本号,EMUI,MIUI,ColorOS,FunthouchOS等 前言 正文 结语 前言 现在手机厂商都推出了自己的基于Androi ...
- 在线加载谷歌地图—lyrs类型解析
在线加载谷歌地图-lyrs类型解析 最近在用openlayers加载在线谷歌地图的时候总结了一下lyrs之后地图类型解析 m 标准路线图 r 某种改变的路线图(路线不明显) s 影像层(卫星图) y ...
- python获取某地铁站经纬度_python基于百度地图获取指定的经纬度信息
在实际做项目的时候经常会遇上需要使用到某个位置经纬度的情况,这个位置的经纬度经常又是没有的,那么就需要基于公开的数据去获取了,这里基于百度地图提供的API来完成指定位置经纬度数据的获取,实现很简单,主 ...
- 谷歌地图如何将地球经纬度坐标系统转换成平面2D坐标系统
一.赤道 二.本初子午线 三.经纬坐标如何将地球经纬度坐标系统转换成平面2D坐标的? 经纬度坐标转bai平面二维du坐标,是通过坐标投影zhi,将经dao纬度的曲面坐zhuan标值,投影变换为平面sh ...
最新文章
- mysql字段优化_MySQL优化(1):字段的设计
- 关于未来的10点核心思考
- ArrayList和LinkedList的add(E)性能秘密
- Linux 操作系统原理 — 内存 — Cache 和 Buffer
- 【实践】简洁大方的summernote 富文本编辑器插件的用发——导入篇
- c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用
- [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
- 泛化,过拟合,欠拟合素材(part1)--python机器学习基础教程
- 如何把Kubernetes config view里的base64编码过后的secret信息还原
- php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server
- centos odbc mysql_Centos下安装并配置ODBC连接MySQL 【转】
- 数据结构队列代码_代码简介:队列数据结构如何工作
- 如何限制创建子网站时只能使用指定的模板
- python自带的库有哪些餐厅_Python 常用的标准库以及第三方库有哪些
- 小米6刷android 8.0,小米小米6(安卓8.0)手机快速救砖,线刷教程分享,小白轻松救活手机...
- 聚类——模糊c均值聚类
- 中国银联在线支付接口开发——前台支付
- 微信支付 unmatched order appid and payment appid
- 玩拍七不再怕,判断7的倍数有妙招
- 美国计算机专业gre314,美国东北大学计算机专业CS硕士录取