利用高德地图的API做了一个类似微信发送位置界面地址选择,界面就3个,一个选择地址(周边搜索),一个搜索界面(关键字搜索),最后将选择的地址信息返回主界面,效果图如下:

androidtv 选择器 android地址选择器_androidtv 选择器

  

androidtv 选择器 android地址选择器_ci_02

 

androidtv 选择器 android地址选择器_高德地图 地址选择 搜索地址 仿微信_03


对于详细地址选择,在项目中难免会遇到,比如电商app,旅游app等等,下面简单讲解如何实现:

一、注册高德开发者账号,创建应用,获取AppId

1.创建应用过程

androidtv 选择器 android地址选择器_ci_04


红色※为必填项

确认随后得到appid

2.下载高德SDK:

androidtv 选择器 android地址选择器_androidtv 选择器_05

二、地址位置选择

1.地址选择界面首先需要定位

private void InitLocation() {
    //初始化client
    locationClient = new AMapLocationClient(this.getApplicationContext());
    //设置定位参数
    locationClient.setLocationOption(getDefaultOption());
    // 设置定位监听
    locationClient.setLocationListener(locationListener);
    locationClient.startLocation();
}

2.定位结果回调

/**
 * 定位监听
 */
AMapLocationListener locationListener = new AMapLocationListener() {
    @Override
    public void onLocationChanged(AMapLocation loc) {
        if (null != loc) {
            //解析定位结果
            String city = loc.getCity();
            Log.e("yufs","當前经度"+loc.getLongitude()+"当前维度:"+loc.getLatitude());
            mLoc=loc;
            lp.setLongitude(loc.getLongitude());
            lp.setLatitude(loc.getLatitude());
            //得到定位信息
            Log.e("yufs","定位详细信息:"+loc.toString());
            mLatitude=loc.getLatitude();
            mLongitude=loc.getLongitude();
            //初始化地图对象
            initMap(loc);
            //查询周边
            doSearchQuery(loc.getCity(),loc.getLatitude(),loc.getLongitude());
        } else {
            Toast.makeText(LocationSelectActivity.this, "定位失败,请打开位置权限", Toast.LENGTH_SHORT).show();
        }
    }
};

3.定位成功回调中进行周边搜索

/**
 * 开始进行poi搜索
 */
protected void doSearchQuery(String city,double latitude,double longitude) {
    String mType="汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施";
    query = new PoiSearch.Query("", mType, city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
    query.setPageSize(20);// 设置每页最多返回多少条poiitem
    query.setPageNum(currentPage);// 设置查第一页
    if (lp != null) {
        poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(this);
        //以当前定位的经纬度为准搜索周围5000米范围
        // 设置搜索区域为以lp点为圆心,其周围5000米范围
        poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(latitude,longitude), 1000, true));//
        poiSearch.searchPOIAsyn();// 异步搜索
    }
}

PoiSearch.SearchBound对象以某一中心点半径5000米的圆搜索结果,PoiSearch.Query()的如果第二个参数未填写会 默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,代码中基本上把高德所有的搜索类型都返回了,你可以根据自己情况而定填写搜索类型

4.poi搜索结果回调监听,获取数据显示

PoiSearch.OnPoiSearchListener onPoiSearchListener = new PoiSearch.OnPoiSearchListener() {
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {
        if (rCode == 1000) {
            if (result != null && result.getQuery() != null) {// 搜索poi的结果
                if (result.getQuery().equals(poiQuery)) {// 是否是同一条
                    lv_list.onLoadComplete();
                    List<PoiItem> poiItems = result.getPois();// 取得第一页的poiitem数据,页数从数字0开始
                    List<PoiBean> tem=new ArrayList<>();
                    if (poiItems != null && poiItems.size() > 0) {
                        for (int i = 0; i < poiItems.size(); i++) {
                            PoiItem poiItem = poiItems.get(i);
                            PoiBean bean=new PoiBean();
                            bean.setTitleName(poiItem.getTitle());
                            bean.setCityName(poiItem.getCityName());
                            bean.setAd(poiItem.getAdName());
                            bean.setSnippet(poiItem.getSnippet());
                            bean.setPoint(poiItem.getLatLonPoint());
                            Log.e("yufs",""+poiItem.getTitle()+","+poiItem.getProvinceName()+","
                                    +poiItem.getCityName()+","
                                    +poiItem.getAdName()+","//区
                                    +poiItem.getSnippet()+","
                                    +poiItem.getLatLonPoint()+"\n");
                            tem.add(bean);
                        }
                        poiData.addAll(tem);
                        mAdapter.notifyDataSetChanged();
                    /* if (isSearch){
                            moveMapCamera(poiItems.get(0).getLatLonPoint().getLatitude(),poiItems.get(0).getLatLonPoint().getLongitude());
                    }*/
                    }
                }
            }
        }
    }



    @Override
    public void onPoiItemSearched(PoiItem poiItem, int i) {

    }
};

其中PoiItem对象为高德提供的一个poi实体类,可以查看返回的数据结构如下:

androidtv 选择器 android地址选择器_ci_06

然后你也可以选择其中有用的信息封装自己的bean,比如我的PoiBean,获取有用的数据之后显示在列表上,到此第一页搞定

三、关键字搜索

protected void doSearchQuery(String keyWord) {
    if(currentPage==0) {
        savePoiItem.clear();
        ll_loading.setVisibility(View.VISIBLE);// 显示进度框
        lv_list.setVisibility(View.GONE);
    }
    query = new PoiSearch.Query(keyWord, "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
    query.setPageSize(10);// 设置每页最多返回多少条poiitem
    query.setPageNum(currentPage);// 设置查第一页
    query.setCityLimit(true);
    poiSearch = new PoiSearch(this, query);
    poiSearch.setOnPoiSearchListener(this);
    poiSearch.searchPOIAsyn();
}

同样调用刚才的搜索接口,只不过加上了关键字,去掉了搜索范围的限制,搜索回调接口同上,将搜索结果显示出来,然后搜索页面搞定(提醒:demo中使用自己在高德申请的Appkey,然后就可查看效果了)