您的位置:首页 > 移动开发 > Android开发

安卓(android)使用GPS,获取经纬度

2018-03-09 09:48 579 查看
android获取经纬度,有这个两个类需要用:
1、LocationManager位置管理器
2、Location位置类
第一步:获取LocationManager实例locationManager = (LocationManager) mContext.getSystemService( Context.LOCATION_SERVICE );第二步:获取位置提供器(GPS或是net)
List<String> 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<Address> 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐