Android中获取用户附近位置

本文介绍了在Android项目中如何获取用户经纬度并利用经纬度接口获取附近位置的实现步骤,包括保存经纬度到sharedPreference,通过接口获取数据,以及使用RecyclerView展示附近位置列表。
摘要由CSDN通过智能技术生成

    最近项目中要获取用户附近位置,供用户选择,该功能分两步实现,第一,获取用户经纬度,第二利,用经纬度通过现有的地理位置接口获取附近位置,实现截图如下:



一、获取用户的经纬度

    获取用户的经纬度,之前已经介绍过,通过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&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值