最近项目中要获取用户附近位置,供用户选择,该功能分两步实现,第一,获取用户经纬度,第二利,用经纬度通过现有的地理位置接口获取附近位置,实现截图如下:
一、获取用户的经纬度
获取用户的经纬度,之前已经介绍过,通过simple-location-tracker实现,具体请看:http://blog.csdn.net/qq_29078329/article/details/56668205。
注意,要在程序启动时获取用户的经纬度,并保存在sharedPreference中,如下:
private void getLocation() {
//允许GPS、WiFi、基站定位,设置超时时间5秒
TrackerSettings trackerSettings = new TrackerSettings();
trackerSettings.setUseGPS(true).setUseNetwork(true).setUsePassive(true).setTimeout(5000);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationTracker locationTracker = new LocationTracker(this, trackerSettings) {
@Override
public void onLocationFound(@NonNull Location location) {
Log.i(TAG, "latitude:" + location.getLatitude() + "longitude" + location.getLongitude());
SharedPrefUtil.getInstance(SplashActivity.this).putString(Constants.LOCATION_LATITUDE_SP_KEY, location.getLatitude() + "");
SharedPrefUtil.getInstance(SplashActivity.this).putString(Constants.LOCATION_lONGITUDE_SP_KEY, location.getLongitude() + "");
}
@Override
public void onTimeout() {
Log.i(TAG, "location time out");
}
};
locationTracker.startListening();
}
二、获取用户附近位置
从sharedPreference中取得经纬度,利用地理位置接口,获取附近位置数据:
//获取附近位置
private void getAddresses() {
String latitude = SharedPrefUtil.getInstance(this).getString(Constants.LOCATION_LATITUDE_SP_KEY);
String longitude = SharedPrefUtil.getInstance(this).getString(Constants.LOCATION_lONGITUDE_SP_KEY);
if (!TextUtils.isEmpty(latitude) && !TextUtils.isEmpty(longitude)) {
mAddressesList = new ArrayList<>();
HttpClient httpClient = new HttpClient();
httpClient.setCallback(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i(TAG, "getLocation onFailure");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonResponse = response.body().string();
JsonUtil.getAddresses(jsonResponse, mAddressesList);
}
}).requestAddresses(latitude, longitude);
}
}
//网络请求
public void requestAddresses(String latitude, String longitude) {
if (TextUtils.isEmpty(latitude) || TextUtils.isEmpty(longitude)) {
throw new NullPointerException("HttpClient.requestAddresses(),latitude is null or longitude is null");
}
OkHttpClient okHttpClient = new OkHttpClient();
Request.Builder builder = new Request.Builder().get().url(Constants.GET_NEARBY_ADDRESSES_URL + "&location=" + latitude + "," + longitude + "&output=json&pois=1");
Request request = builder.build();
Call call = okHttpClient.newCall(request);
call.enqueue(mCallback);
}
//附近位置接口
String GET_NEARBY_ADDRESSES_URL = "http://api.map.baidu.com/geocoder/v2/?ak=6eea93095ae93db2c77be9ac910ff311&location=39.908853,116.366893&output=json&pois=1";
{
"status": 0,
"result": {
"location": {
"lng": 116.36689299999995,
"lat": 39.90885307752264
},
"formatted_address": "北京市西城区鲍家街43",
"business": "复兴门,西便门,长椿街",
"addressComponent": {
"country": "中国",
"country_code": 0,
"province": "北京市",
"city": "北京市",
"district": "西城区",
"town": "",
"adcode": "110102",
"street": "鲍家街",
"street_number": "43",
"direction": "附近",
"distance": "24"
},
"pois": [
{
"addr": "鲍家街43号及宗帽胡同甲2号",
"cp": " ",
"direction": "附近",
"distance": "35",
"name": "醇亲王南府",
"poiType": "旅游景点",
"point": {
"x": 116.36717845491187,
"y": 39.90874097912572
},
"tag": "旅游景点;文物古迹",
"tel": "",
"uid": "c1820fb2f1833759cac3db1e",
"zip&#