android通过高德地图仿微信发送地址移动地图自动搜索附近店铺及地址(架包和配置参考高德地图官网)

原创 2016年08月31日 15:41:12
package com.example.daniel.carwashmerchant.modules.enter_approved.controllers;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.CameraPosition;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.Marker;
import com.amap.api.maps2d.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.example.daniel.carwashmerchant.R;
import com.example.daniel.carwashmerchant.modules.common.controllers.CWBaseActivity;
import com.example.daniel.carwashmerchant.modules.common.views.NavigationBar;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import common.android.lib.ui.base.CustBaseAdapter;

/**
 * Created by daniel on 2016/8/12.
 */
public class AddressActivity extends CWBaseActivity implements AMap.OnCameraChangeListener,
        PoiSearch.OnPoiSearchListener, AMapLocationListener, AdapterView.OnItemClickListener {

    private MapView mapView;
    private ListView listView;
    private List<Map<String, String>> list;
    private AddressAdapter adapter;
    private final int ADDRESS = 2001;
    private AMap aMap;
    private AMapLocationClient mlocationClient;
    private AMapLocationClientOption mLocationOption;
    private LocationSource.OnLocationChangedListener mListener;
    private LatLng locationLatLng;
    private Marker marker;// 有跳动效果的marker对象
    private LatLonPoint latLonPoint;
    private boolean fri;
    private int currentPage = 0;// 当前页面,从0开始计数
    private PoiSearch.Query query;// Poi查询条件类
    private PoiSearch poiSearch;// POI搜索
    private List<PoiItem> poiItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address);
        NavigationBar navigationBar = (NavigationBar) findViewById(R.id.navigationBar);
        navigationBar.setTitle(getResources().getString(R.string.my_position));
        ((ImageView) navigationBar.getBackBackButton()).setImageResource(R.mipmap.commonality_back_icon);
        listView = (ListView) findViewById(R.id.poi_listView);
        listView.setOnItemClickListener(this);
        list = new ArrayList<>();
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);
        adapter = new AddressAdapter(this, list);
        listView.setAdapter(adapter);
        init();
    }

    // 初始化AMap对象
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
            // 对amap添加移动地图事件监听器
            aMap.setOnCameraChangeListener(this);
            //设置定位监听
            aMap.setLocationSource(locationSource);
            // 设置默认定位按钮是否显示
            aMap.getUiSettings().setMyLocationButtonEnabled(true);
            // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
            aMap.setMyLocationEnabled(true);
        }
    }

    private void addMarker(LatLng latLng) {
        if (!fri) {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            markerOptions.icon(BitmapDescriptorFactory.defaultMarker());
            markerOptions.draggable(true);
            markerOptions.title(getResources().getString(R.string.my_position));
            marker = aMap.addMarker(markerOptions);
            fri = true;
        }

    }

    /**
     * 定位成功后回调函数
     *
     * @param amapLocation
     */
    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (mListener != null && amapLocation != null) {
            if (amapLocation != null && amapLocation.getErrorCode() == 0) {
                mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                float bearing = aMap.getCameraPosition().bearing;
                aMap.setMyLocationRotateAngle(bearing);// 设置小蓝点旋转角度
                Double geoLat = amapLocation.getLatitude();//获取纬度
                Double geoLng = amapLocation.getLongitude();//获取经度
                locationLatLng = new LatLng(geoLat, geoLng);
                addMarker(locationLatLng);
                //获得小点
                if (latLonPoint == null) {
                    latLonPoint = new LatLonPoint(geoLat, geoLng);
                } else {
                    latLonPoint.setLatitude(geoLat);
                    latLonPoint.setLongitude(geoLng);
                }
                //设置地图显示的位置
                aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(locationLatLng, 30));
                //将地图移动到定位点
                aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(geoLat, geoLng)));
                //点击定位按钮 能够将地图的中心移动到定位点
                mListener.onLocationChanged(amapLocation);
                locationSource.deactivate();
                StringBuffer buffer = new StringBuffer();
                buffer.append(amapLocation.getProvince() + "" + amapLocation.getCity() + ""
                        + amapLocation.getDistrict() + "" + amapLocation.getStreet() + ""
                        + amapLocation.getStreetNum());
                showToastMessage(buffer.toString());
                doSearchQuery();
            } else {
                //显示错误信息ErrCode是错误码,errInfo是错误信息
                String err = "定位失败," + amapLocation.getErrorCode() + ": " + amapLocation.getErrorInfo();
                showToastMessage(err);
            }
        }
    }

    LocationSource locationSource = new LocationSource() {

        @Override
        public void deactivate() {
            mListener = null;
            if (mlocationClient != null) {
                mlocationClient.stopLocation();
                mlocationClient.onDestroy();
            }
            mlocationClient = null;
        }

        @Override
        public void activate(OnLocationChangedListener listener) {
            mListener = listener;
            if (mlocationClient == null) {
                mlocationClient = new AMapLocationClient(AddressActivity.this);
                //初始化定位参数
                mLocationOption = new AMapLocationClientOption();
                //设置定位监听
                mlocationClient.setLocationListener(AddressActivity.this);
                //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
                mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                //设置是否返回地址信息(默认返回地址信息)
                mLocationOption.setNeedAddress(true);
                //设置是否只定位一次,默认为false
                mLocationOption.setOnceLocation(false);
                //设置是否强制刷新WIFI,默认为强制刷新
                mLocationOption.setWifiActiveScan(true);
                //设置是否允许模拟位置,默认为false,不允许模拟位置
                mLocationOption.setMockEnable(false);
                //设置定位间隔,单位毫秒,默认为2000ms
                mLocationOption.setInterval(2000);
                //设置定位参数
                mlocationClient.setLocationOption(mLocationOption);
                //启动定位
                mlocationClient.startLocation();
            }
        }
    };

    /**
     * 移动地图调用
     *
     * @param position
     */
    @Override
    public void onCameraChange(CameraPosition position) {
        if (position != null) {
            LatLng target = position.target;
            marker.setPosition(target);
        }
    }

    /**
     * 移动完成定位
     *
     * @param position
     */
    @Override
    public void onCameraChangeFinish(CameraPosition position) {
        if (marker != null) {
            //目标位置的屏幕中心点经纬度坐标
            LatLng target = position.target;
            latLonPoint = new LatLonPoint(target.latitude, target.longitude);
            doSearchQuery();
        }
    }

    /**
     * 执行搜索
     */
    public void doSearchQuery() {
        currentPage = 0;
        // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
        query = new PoiSearch.Query("", "", "西安市");
        query.setPageSize(20);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页

        poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(this);
        //设置移动点附近搜索范围
        if (latLonPoint != null) {
            PoiSearch.SearchBound searchBound = new PoiSearch.SearchBound(latLonPoint, 2000);
            poiSearch.setBound(searchBound);
        }
        poiSearch.searchPOIAsyn();
    }

    /**
     * 搜索完成回调
     *
     * @param result
     * @param rCode
     */
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {
        if (rCode == 1000) {
            if (result != null && result.getQuery() != null) {
                // 取得搜索到的poiitems有多少页
                poiItems = result.getPois();// 取得第一页的poiitem数
                list.clear();
                for (PoiItem poiItem : poiItems) {
                    //附近店铺名称
                    String adName = poiItem.getTitle();
                    //附近店铺详细地址
                    String snippet = poiItem.getSnippet();
                    //获取纬度
                    double latitude = poiItem.getLatLonPoint().getLatitude();
                    //获取经度
                    double longitude = poiItem.getLatLonPoint().getLongitude();
                    Log.i("", "-------维度---------" + latitude + "-------经度-------" + longitude);
                    Map<String, String> map = new HashMap<>();
                    map.put("name", adName);
                    map.put("address", snippet);
                    map.put("latitude", latitude + "");
                    map.put("longitude", longitude + "");
                    list.add(map);

                }
                adapter.notifyDataSetChanged();
            } else {
                showToastMessage("未找到附近相关地址");
            }
        } else {
            showToastMessage("获取附近地址失败,请稍后重试");
        }
    }

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

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent();
        //选择的地址
        intent.putExtra("checkedAddress", list.get(position).get("address"));
        //选择地址的维度
        intent.putExtra("latitude", list.get(position).get("latitude").toString());
        //选择地址的经度
        intent.putExtra("longitude", list.get(position).get("longitude").toString());
        setResult(ADDRESS, intent);
        finish();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
        locationSource.deactivate();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }


    class AddressAdapter extends CustBaseAdapter {

        private Context mContext;
        private List<Map<String, String>> list;

        public AddressAdapter(Context mContext, List<Map<String, String>> list) {
            this.mContext = mContext;
            this.list = list;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            if (view == null) {
                view = LayoutInflater.from(mContext).inflate(R.layout.activity_address_poi_list_item, parent, false);
            }
            TextView name = get(view, R.id.poi_name);
            TextView address = get(view, R.id.poi_address);
            name.setText(list.get(position).get("name"));
            address.setText(list.get(position).get("address"));
            return view;
        }
    }
}

【云图】如何设置微信里的全国实体店地图?

商家福利!如何提高微信公众平台的粉丝数?如何更好地与粉丝互动?如何为客户提供更好的网络服务? 答案是,为自己的微信公众平台,添加地图功能。有了地图,您的用户能更好更快地找到您实体店的地址,快捷地查询...
  • api_autonavi
  • api_autonavi
  • 2014年06月23日 16:57
  • 3579

【云图】如何制作附近实体店的地图?-微信微博支付宝

摘要: 附近连锁店地图与全国连锁店地图,最大的区别就是: 1、附近连锁店地图需要先定位,然后搜索附近的店铺。 2、全国连锁店地图,是先选择城市,然后检索某城市内的全部门店信息。 本文就详细讲解...
  • api_autonavi
  • api_autonavi
  • 2014年06月23日 16:44
  • 1838

Android高德地图poi检索仿微信发送位置

最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下:从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,...
  • tijjyire
  • tijjyire
  • 2017年04月12日 15:45
  • 1951

利用高德地图关键字检索POI-实现仿微信发朋友圈搜索附近位置

前言由于项目中需要实现搜索附近位置作为收获地址,所以采用了高德地图的关键字检索POI来实现。官方Demo看了很复杂,估计很多人都不想看。但是看了我写的Demo你就会觉得So Easy啦!先上效果图高德...
  • Alpha58
  • Alpha58
  • 2017年02月25日 14:07
  • 4096

利用百度地图,实现移动端附近门店功能

利用百度地图,实现移动端附近门店功能
  • w263756314
  • w263756314
  • 2016年06月06日 16:02
  • 4011

【云图】如何设置支付宝里的家乐福全国连锁店地图?

摘要:本文详细讲解了,如何设置支付宝服务窗。商家如何将自己的全国连锁店放置到云图上,并且在支付宝服务窗中提供地图查询功能。本文所包含的地图服务为: 1、按城市查询门店地址; 2、列表模式和地图模式...
  • api_autonavi
  • api_autonavi
  • 2014年06月23日 16:56
  • 1882

Android类似微信详细地址选择(高德地图)

利用高德地图的API做了一个类似微信发送位置界面地址选择,界面就3个,一个选择地址(周边搜索),一个搜索界面(关键字搜索),最后将选择的地址信息返回主界面,效果图如下:     对于详细地...
  • Ikulm
  • Ikulm
  • 2017年04月18日 16:52
  • 2059

高德地图搜索附近的实现

最近项目中有用到搜索附近4S店和加油站的功能,于是我写了个Demo,输入你想查找的内容,就可以显示相关的信息.效果如下:         PS:listview中有两个纬度,后一个应该是经度的,不小心...
  • qq_31530015
  • qq_31530015
  • 2016年04月23日 17:04
  • 7293

京东店铺详情页如何做关联销售?如何给图片加热点链接?

顾客进入店铺是时,如何提高客单价,如何提高访问深度。这些都是运营一直探索的问题,用的最多的无非也就是关联销售,今天我们来说下京东详情页的关联销售。 为什么说京东详情页的关联销售呢,因为淘宝、天猫的这种...
  • fengzideshijie2
  • fengzideshijie2
  • 2016年05月10日 10:35
  • 13226

矢量室内地图

因为公司项目的需要,需要开发一套室内地图,并实现路线的规划功能。因为之前没做过这方面的开发,相关的资料也比较少,所以只能一个人去摸索。刚开始我是使用一般的位图去当作的地图,但是这个也让我在后面吃了不少...
  • u013043346
  • u013043346
  • 2015年12月07日 16:03
  • 33304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android通过高德地图仿微信发送地址移动地图自动搜索附近店铺及地址(架包和配置参考高德地图官网)
举报原因:
原因补充:

(最多只允许输入30个字)