百度地图定位后数据为null

2018-12-05  本文已影响0人  世道无情
1. 概述

这里记录下自己项目中的,首页百度地图获取定位后无法获取定位后的数据。

场景:
在首页HomeFragment中,一开始进入界面后需要获取当前位置,在本地接口的http环境下定位成功后,可以获取到当前位置的city、address及经纬度等信息,但是切换到线上的 https环境后,然后再次在首页获取定位,这个时候定位后,貌似只能获取到经纬度,其余的 city、地址等所有信息全是 null,自己也不知道啥原因,感觉和https环境没关系,自己处理方式是:定位成功后,获取到经纬度,采用反编码,根据经纬度获取地址信息;

哪位知道啥原因的可以给我留言,自己不太清楚这个啥原因;

2. 代码如下

@Override
    public void onResume() {
        super.onResume();
        initLocationOption() ;
    }

private void initLocationOption() {
        //定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
        LocationClient locationClient = new LocationClient(BaseApplication.getContext());
        //声明LocationClient类实例并配置定位参数
        LocationClientOption locationOption = new LocationClientOption();
        MyLocationListener myLocationListener = new MyLocationListener();
        //注册监听函数
        locationClient.registerLocationListener(myLocationListener);
        //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
        locationOption.setCoorType("gcj02");
        //可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        locationOption.setScanSpan(1000);
        //可选,设置是否需要地址信息,默认不需要
        locationOption.setIsNeedAddress(true);
        //可选,设置是否需要地址描述
        locationOption.setIsNeedLocationDescribe(true);
        //可选,设置是否需要设备方向结果
        locationOption.setNeedDeviceDirect(false);
        //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        locationOption.setLocationNotify(true);
        //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        locationOption.setIgnoreKillProcess(true);
        //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        locationOption.setIsNeedLocationDescribe(true);
        //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        locationOption.setIsNeedLocationPoiList(true);
        //可选,默认false,设置是否收集CRASH信息,默认收集
        locationOption.SetIgnoreCacheException(false);
        //可选,默认false,设置是否开启Gps定位
        locationOption.setOpenGps(true);
        //可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
        locationOption.setIsNeedAltitude(false);
        //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
        locationOption.setOpenAutoNotifyMode();
        //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
        locationOption.setOpenAutoNotifyMode(3000,1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
        //开始定位
        locationClient.start();
    }


/**
     * 实现定位回调
     */
    public class MyLocationListener extends BDAbstractLocationListener {

        /**
         * 定位
         */
        @Override
        public void onReceiveLocation(BDLocation location){
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            //获取纬度信息
            double latitude = location.getLatitude();
            //获取经度信息
            double longitude = location.getLongitude();
            //获取定位精度,默认值为0.0f
            float radius = location.getRadius();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
            String coorType = location.getCoorType();
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
            int errorCode = location.getLocType();

            String addrStr = location.getAddrStr();
            int locationWhere = location.getLocationWhere();
            String buildingName = location.getBuildingName();
            Address address = location.getAddress();
            String street = location.getStreet();
            List<Poi> poiList = location.getPoiList();
//            List<Poi> poiList = location.getPoiList();
//            String name = poiList.get(0).getName();

            Log.e("TAG" , "定位回调:latitude: "+latitude+", longitude: "+longitude+", addrStr: "+addrStr+", locationWhere: "+locationWhere+", " +
                    "buildingName: "+buildingName+", address: "+address+", street: "+street+", poiList: "+poiList) ;
            LatLng ll = new LatLng(location.getLatitude(),
                    location.getLongitude());


            // 定位成功后,保存当前位置经纬度
            String strLatitude = Double.toString(latitude) ;  // 维度
            String strLongitude = Double.toString(longitude) ;// 经度

            PrefUtils.putString(getActivity() , "strLatitude" , strLatitude);
            PrefUtils.putString(getActivity() , "strLongitude" , strLongitude);

            getdata(ll);
        }
    }


    /**
     * 定位后获取当前经纬度,根据经纬度 采用反编码 获取当前位置信息
     */
    private void getdata(LatLng ll) {
        GeoCoder geoCoder = GeoCoder.newInstance();
        //
        OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
            // 反地理编码查询结果回调函数
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                if (result == null
                        || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    // 没有检测到结果
                    Toast.makeText(getActivity() , "抱歉,未能找到结果",
                            Toast.LENGTH_LONG).show();
                    return;
                }

                /*String addressBig = result.getSematicDescription(); // 美华·海润大厦南135米
                String addressSmall = result.getAddress() ; // 北京市海淀区海淀南路36号,


                String address = result.getAddress();
                String street = result.getAddressDetail().street;
                String businessCircle = result.getBusinessCircle();
                List<ReverseGeoCodeResult.PoiRegionsInfo> poiRegionsInfoList = result.getPoiRegionsInfoList();
                List<PoiInfo> poiInfos = (ArrayList<PoiInfo>) result.getPoiList();*/

                List<PoiInfo> poiInfos = (ArrayList<PoiInfo>) result.getPoiList();

                address = poiInfos.get(0).address ;

                // 如果定位成功,则用sp保存定位后当前默认的地址
                PrefUtils.putString(getActivity() , DEFAULT_POSI , address);

                showPosiAddress(address) ;

            }

            // 地理编码查询结果回调函数
            @Override
            public void onGetGeoCodeResult(GeoCodeResult result) {
                if (result == null
                        || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    // 没有检测到结果
                }
            }
        };
        // 设置地理编码检索监听者
        geoCoder.setOnGetGeoCodeResultListener(listener);
        //
        geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(ll));
    }


    private void showPosiAddress(String address) {
        if (!TextUtils.isEmpty(mAddressFlag)){
            tv_location.setText(!TextUtils.isEmpty(mAddressFlag) ? mAddressFlag : "");
        }else if (!TextUtils.isEmpty(address)) {
            tv_location.setText(!TextUtils.isEmpty(address) ? address : "");
        }
    }

更详细的可以参照 下边这篇博客:
https://blog.csdn.net/a_ycmbc/article/details/51459502

上一篇下一篇

猜你喜欢

热点阅读