最近需要对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利用谷歌地图获取并解析经纬度对应的地理位置相关推荐

  1. Android 通过高德地图获取地址的经纬度

    不废话,需求:输入一个地址,获取到它的经纬度,怎么办? 1.到高德开放平台申请,获取key 高德开放平台:https://lbs.amap.com/ 2.下载高德定位及地址搜索SDK:https:// ...

  2. python 根据地址求经纬度 谷歌_js获取ip地址利用谷歌地图获得经纬度

    js获取ip地址利用谷歌地图获得经纬度-www.jquerycn.cn var  massage=null; function userip(ip){ $.getScript("http:/ ...

  3. 基于Android的谷歌地图地理围栏功能开发

    第一步.Android使用谷歌地图权限 Android上使用谷歌地图 必备条件:翻墙.Android设备上安装Google Play Service 由于谷歌在国内已经被墙了,所以我们只能使用翻墙软件 ...

  4. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...

    Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...

  5. Android 开源1:获取并解析网页信息(Jsoup)

    Android 开源1:获取并解析网页信息(Jsoup) Android 开源1获取并解析网页信息Jsoup 一程序功能 二程序界面 三程序知识点与创新点 四 总结 一.程序功能 本款APP主要是通过 ...

  6. Android利用Java反射获取用户手机的rom定制系统及版本,EMUI,MIUI,ColorOS,FunthouchOS等

    Android利用Java反射获取用户手机的rom定制系统版本及版本号,EMUI,MIUI,ColorOS,FunthouchOS等 前言 正文 结语 前言 现在手机厂商都推出了自己的基于Androi ...

  7. 在线加载谷歌地图—lyrs类型解析

    在线加载谷歌地图-lyrs类型解析 最近在用openlayers加载在线谷歌地图的时候总结了一下lyrs之后地图类型解析 m 标准路线图 r 某种改变的路线图(路线不明显) s 影像层(卫星图) y ...

  8. python获取某地铁站经纬度_python基于百度地图获取指定的经纬度信息

    在实际做项目的时候经常会遇上需要使用到某个位置经纬度的情况,这个位置的经纬度经常又是没有的,那么就需要基于公开的数据去获取了,这里基于百度地图提供的API来完成指定位置经纬度数据的获取,实现很简单,主 ...

  9. 谷歌地图如何将地球经纬度坐标系统转换成平面2D坐标系统

    一.赤道 二.本初子午线 三.经纬坐标如何将地球经纬度坐标系统转换成平面2D坐标的? 经纬度坐标转bai平面二维du坐标,是通过坐标投影zhi,将经dao纬度的曲面坐zhuan标值,投影变换为平面sh ...

最新文章

  1. mysql字段优化_MySQL优化(1):字段的设计
  2. 关于未来的10点核心思考
  3. ArrayList和LinkedList的add(E)性能秘密
  4. Linux 操作系统原理 — 内存 — Cache 和 Buffer
  5. 【实践】简洁大方的summernote 富文本编辑器插件的用发——导入篇
  6. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用
  7. [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
  8. 泛化,过拟合,欠拟合素材(part1)--python机器学习基础教程
  9. 如何把Kubernetes config view里的base64编码过后的secret信息还原
  10. php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server
  11. centos odbc mysql_Centos下安装并配置ODBC连接MySQL 【转】
  12. 数据结构队列代码_代码简介:队列数据结构如何工作
  13. 如何限制创建子网站时只能使用指定的模板
  14. python自带的库有哪些餐厅_Python 常用的标准库以及第三方库有哪些
  15. 小米6刷android 8.0,小米小米6(安卓8.0)手机快速救砖,线刷教程分享,小白轻松救活手机...
  16. 聚类——模糊c均值聚类
  17. 中国银联在线支付接口开发——前台支付
  18. 微信支付 unmatched order appid and payment appid
  19. 玩拍七不再怕,判断7的倍数有妙招
  20. 美国计算机专业gre314,美国东北大学计算机专业CS硕士录取

热门文章

  1. java3D实现空间立方体_CSS3 3D旋转立方体
  2. 苹果cms免费自适应模板下载
  3. 如何实现线上收款 到不同账户支付宝账户
  4. excel 中vb组合框_Excel数据验证组合框代码
  5. 【中亦安图】Systemstate Dump分析经典案例(7)
  6. 写给大家看的设计模式 1
  7. 搬上小板凳,听嵌入式大牛讲解硬核单片机编程思想!
  8. cad引出线段lisp_利用lisp给CAD直线取整?
  9. 【雕爷学编程】Arduino动手做(2)---光敏电阻模块
  10. 帆船驾驶技术的物理学原理