赞
踩
应公司项目需求,实现gps离线定位+百度地图展示,上一篇主要实现了地图的gps离线定位展示Android实现百度离线地图+gps定位,这一篇就是为了实现逆地址信息解析,利用android自带原生Geocoder进行获取解析。
可以看到解析获取到的是一个Address对象数据,然后我们只需要拼接起来即可组成当前定位位置。
/** * 根据经纬度获取地理位置 * * @param latitude 纬度 * @param longitude 经度 * @return {@link Address} */ public static Address getAddress(double latitude, double longitude) { //AppApplication.getInstance() 换成对应的context即可 Geocoder geocoder = new Geocoder(AppApplication.getInstance(), Locale.getDefault()); try { List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1); Log.e("测试",addresses.toString()); if (addresses.size() > 0) return addresses.get(0); } catch (IOException e) { e.printStackTrace(); } return null; }
开辟线程获取解析的地址信息,是因为android8.0手机调用getFromLocation()
方法获取不到,只能在线程里面去获取。
/** * 根据经纬度获取所在详细信息 * * @param latitude 纬度 * @param longitude 经度 * @return 详细信息 */ public static String getStreet(double latitude, double longitude) { final Address[] address = new Address[1]; new Thread(){ @Override public void run() { address[0] = getAddress(latitude, longitude); Log.e("定位数据",address[0].toString()); //方法一就是通过在线程里面文件存储起来地址信息 if (address[0] !=null&& address[0].getAddressLine(2)!=null){ //使用SharedPreferences,代码就不贴了 SPUtils.put("sj", address[0].getAddressLine(0)+ address[0].getAddressLine(1)+ address[0].getAddressLine(2)); } } }.start(); // 方法二:线程休眠1s,但是应用会有明显延迟,不建议 /*try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }*/ //上面的方法一也要做地址判断是否存在街道信息,这里懒得改了 if (address[0] !=null&& address[0].getAddressLine(2)!=null){ return address[0].getAddressLine(0)+ address[0].getAddressLine(1)+ address[0].getAddressLine(2); } return address[0] == null ? "unknown" : address[0].getAddressLine(0)+ address[0].getAddressLine(1); }
//这里先调用方法使地址信息保存下来,然后再取值
LocationUtils.getStreet(location.getLatitude(),location.getLongitude());
etAddress.setText(SPUtils.get("sj","unkown").toString());
经测试,android8.0的手机也可以正常显示解析完的地址。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。