安卓(android)使用GPS,获取经纬度
16lz
2021-01-23
android获取经纬度,有这个两个类需要用:
1、LocationManager位置管理器
2、Location位置类
第一步:获取LocationManager实例
locationManager = (LocationManager) mContext.getSystemService( Context.LOCATION_SERVICE );
第二步:获取位置提供器(GPS或是net) List providers = locationManager.getProviders( true );
第三步:判断位置提供器的类型
if (providers.contains( LocationManager.NETWORK_PROVIDER )) { //如果是网络定位 Log.d( TAG, "如果是网络定位" ); locationProvider = LocationManager.NETWORK_PROVIDER; } else if (providers.contains( LocationManager.GPS_PROVIDER )) { //如果是GPS定位 Log.d( TAG, "如果是GPS定位" ); locationProvider = LocationManager.GPS_PROVIDER; } else { Log.d( TAG, "没有可用的位置提供器" ); return; }
第四步:判断权限,主要是判断GPS,6.0以上需要动态获取权限,权限判断和检查是比较简单的,只是用户拒绝后的处理,各个手机品牌的适配比较复杂,如果仅仅是研究GPS的不需要判断权限,6.0以上手动给权限即可
第五步:设置位置监听器
// 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace locationManager.requestLocationUpdates( locationProvider, 0, 0, locationListener );
locationListener直接声明即可一般只处理onLocationChanged函数,获取location实例即可
LocationListener locationListener = new LocationListener() { /** * 当某个位置提供者的状态发生改变时 */ @Override public void onStatusChanged(String provider, int status, Bundle arg2) { } /** * 某个设备打开时 */ @Override public void onProviderEnabled(String provider) { } /** * 某个设备关闭时 */ @Override public void onProviderDisabled(String provider) { } /** * 手机位置发生变动 */ @Override public void onLocationChanged(Location location) { location.getAccuracy();//精确度 setLocation( location ); } };
获取location实例后经纬度的获取就非常简单了:
String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();
最简单的获取经纬度到这一步就成功了
获取到经纬度后解析成地理位置
List addList = null; Geocoder ge = new Geocoder(MainActivity.this); try { addList = ge.getFromLocation(location.getLatitude(), location.getLongitude(), 1); } catch (IOException e) { e.printStackTrace(); } if (addList != null && addList.size() > 0) { for (int i = 0; i < addList.size(); i++) { Address ad = addList.get(i); address = ad.getAdminArea() + ad.getFeatureName();//拿到城市 } }
贴一张ad的图,大家根据需要拿业务需要的数据
、
好了,暂时就写到这
<------------------------分割线------------------------->
最近发现使用原生方法逆向解析经纬度有些问题
1、有些机型上文的addList为空,具体原因,查阅了一些资料,说是google服务的问题
2、直辖市和省对象属性刚好错开了一个,对这方面有要求的注意一下
3、针对问题一,采用网络请求的方式逆向解析
请求的地址:
我只用了谷歌,百度貌似需要注册之类的
private static String GOOGLE_GPS_PREFIX = "http://maps.google.cn/maps/api/geocode/json?latlng=";private static String GOOGLE_GPS_SUFFIX = "&sensor=true,language=zh-CN";完整请求地址为
GOOGLE_GPS_PREFIX +latitude+,+longitude+GOOGLE_GPS_SUFFIX
请求方式
URL url = new URL(urlPath); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setReadTimeout(2000); httpURLConnection.setConnectTimeout(5 * 1000); httpURLConnection.setUseCaches(true); httpURLConnection.setRequestMethod("GET"); if (httpURLConnection.getResponseCode() == 200) { InputStream inputStream = httpURLConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(isr); String temp = null; StringBuffer jsonsb = new StringBuffer(); while ((temp = br.readLine()) != null) { jsonsb.append(temp); } return jsonsb; } httpURLConnection.disconnect();
返回的是一个json值,需要的同学可以自行根据需要解析自己需要的值
偶尔jsonsb值为错误信息,可以使用while多请求几次,推荐使用AsyncTask进行网络请求和解析,网络请求不能放到主线程
用Thread我又觉得太麻烦,各位看官如果有更好的想法,欢迎留言讨论
20180322
更多相关文章
- android获取经纬度和地方名称
- android学习轨迹之二:Android权限标签uses-permission的书写位置
- Android 获取手机本地图片所在的位置
- Android启动时启动Activity 的定义的位置
- Android数据存储路径位置
- Android 权限全集
- Android GPS获取地理位置
- Android 获取手机当前所在的经纬度
- Android 利用adb命令 使App自动点击屏幕指定位置