高德地图仿微信实现发送位置

package com.huak.hhp4a.view;


import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
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.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.AMap.OnCameraChangeListener;
import com.amap.api.maps2d.AMap.OnMapClickListener;
import com.amap.api.maps2d.AMap.OnMapLoadedListener;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.UiSettings;
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.core.SuggestionCity;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.poisearch.PoiSearch.SearchBound;
import com.huak.hhp4a.R;
import com.huak.hhp4a.adapter.AddressAdapter;
import com.huak.hhp4a.utils.DebugUtils;
import com.huak.hhp4a.utils.ToastUtil;
import com.huak.hhp4a.view.ui.ClearableEditText;

import java.util.ArrayList;
import java.util.List;

public class LocationSourceActivity extends Activity implements LocationSource,
        AMapLocationListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener,
        AMap.InfoWindowAdapter, OnMapLoadedListener, OnCameraChangeListener,
        AnimationListener, OnClickListener, OnMapClickListener,
        com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener
        , OnGeocodeSearchListener {
    private AMap aMap;
    private MapView mapView;
    private OnLocationChangedListener mListener;
    private UiSettings mUiSettings;
    private AMapLocation aLocation;
    private Animation centerMarker;
    private ImageView centerImageView;
    private Marker currentMarker;
    private String citycode;
    private boolean isFirst = true;
    private Boolean isByContent = false;
    private Boolean isByItem = false;
    private static final long minTime = -1;// 位置变化的通知时间,单位为毫秒
    private static final float minDistance = 10;// 位置变化通知距离,单位为米
    private ClearableEditText et_search_key;
    private TextView tv_search;//发送按钮
    private ArrayList<Boolean> isChecked = new ArrayList();
    private AddressAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.locationsource_activity);
        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        centerMarker = AnimationUtils.loadAnimation(this,
                R.anim.bounce_interpolator);
        centerImageView = (ImageView) findViewById(R.id.centerMarkerImg);
        lvPoiList = (ListView) findViewById(R.id.lvPoiList);
        et_search_key = (ClearableEditText) findViewById(R.id.et_search_key);
        tv_search = (TextView) findViewById(R.id.tv_search);
        adapter = new AddressAdapter(this, poiItems);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        initMap();
        getLocationInfo();
    }

    private void getLocationInfo() {
        mLocationManager = LocationManagerProxy.getInstance(this);
        mLocationManager.requestLocationData(LocationProviderProxy.AMapNetwork, minTime, minDistance, this);
    }

    /**
     * 定位成功后回调函数
     */
    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
    
        if (mListener != null && amapLocation != null) {
            if (amapLocation != null
                    && amapLocation.getAMapException().getErrorCode() == 0) {
                mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                if (isFirst) {
                    isFirst = false;
                    aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(
                            amapLocation.getLatitude(), amapLocation.getLongitude())));
                    CameraUpdateFactory.zoomTo(17);
                }
            }
        }
    }

    /**
     * 激活定位
     */
    private LocationManagerProxy mLocationManager;

    @Override
    public void activate(OnLocationChangedListener listener) {
        mListener = listener;
        if (mLocationManager == null) {
            mLocationManager = LocationManagerProxy.getInstance(this);
            /*
             * mAMapLocManager.setGpsEnable(false);
          * 1.0.2版本新增方法,设置true表示混合定位中包含gps定位,false表示纯网络定位,默认是true Location
          * API定位采用GPS和网络混合定位方式
          * ,第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者
          */
            mLocationManager.requestLocationUpdates(LocationProviderProxy.AMapNetwork, 2000, 10, this);
        }
    }

    /**
     * 停止定位
     */
    @Override
    public void deactivate() {
        mListener = null;
    }


    /**
     * 初始化AMap对象
     */
    private void initMap() {
        if (aMap == null) {
            aMap = mapView.getMap();
            mUiSettings = aMap.getUiSettings();
        }

        aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//        aMap.setMyLocationRotateAngle(180);
        aMap.setLocationSource(this);// 设置定位监听
        mUiSettings.setMyLocationButtonEnabled(true); // 是否显示默认的定位按钮
        aMap.setMyLocationEnabled(true);// 是否可触发定位并显示定位层

//    mUiSettings.setTiltGesturesEnabled(false);// 设置地图是否可以倾斜
        mUiSettings.setScaleControlsEnabled(false);// 设置地图默认的比例尺是否显示
        mUiSettings.setZoomControlsEnabled(false);
        initMapListener();
        geocoderSearch = new GeocodeSearch(this);
        geocoderSearch.setOnGeocodeSearchListener(this);
        progDialog = new ProgressDialog(this);
    }

    private void initMapListener() {
        aMap.setOnMapLoadedListener(this);
        aMap.setOnCameraChangeListener(this);
        aMap.setOnMarkerClickListener(this);
        aMap.setOnInfoWindowClickListener(this);
        aMap.setInfoWindowAdapter(this);// 设置自定义InfoWindow样式
        aMap.setOnMapClickListener(this);
        centerMarker.setAnimationListener(this);
        et_search_key.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int keyCode, KeyEvent event) {
                //修改回车键功能
                if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    activate((OnLocationChangedListener) mListener);
                    DebugUtils.e("-----jinlaile");

                    final String Key = v.getText().toString().trim();
                    if (TextUtils.isEmpty(Key)) {
                        // 先隐藏键盘
                        // 先隐藏键盘
                        hideSoftInput(v.getWindowToken());
                        ToastUtil.showToast("请输入搜索关键词");
                        doSearchQuery(citycode);
                    } else {
                        isByContent = true;
                        SearchPoi(Key);
                        // 先隐藏键盘
                        hideSoftInput(v.getWindowToken());
                    }
                    return true;
                }
                return false;
            }

        });



        lvPoiList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                for (int i = 0; i <poiItems.size(); i++) {
                    isChecked.add(i, false);
                }
                Boolean ischeck = (Boolean) isChecked.get(position);
                isChecked.add(position, !ischeck);
                adapter.Choose(isChecked);
                isByItem = true;
                Double lats = poiItems.get(position).getLatLonPoint().getLatitude();
                Double lons = poiItems.get(position).getLatLonPoint().getLongitude();
                aMap.animateCamera(CameraUpdateFactory.changeLatLng(new LatLng(
                        lats, lons)));
            }
        });

    }


    public void hideSoftInput(IBinder token) {
        if (token != null) {
            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            im.hideSoftInputFromWindow(token,
                    InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

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

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

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

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

    @Override
    public void onMapLoaded() {
        centerImageView.startAnimation(centerMarker);
        CameraUpdateFactory.zoomTo(17);
        Log.e("load", "onMapLoaded");

    }

    @Override
    public void onCameraChange(CameraPosition arg0) {

    }

    private MarkerOptions markerOption;
    private com.amap.api.services.core.LatLonPoint point;

    @Override
    public void onCameraChangeFinish(CameraPosition arg0) {
//        if(isByItem){
//            isByItem=false;
//        }
        if (isByContent) {
            isByContent = false;
        } else {
            point = new LatLonPoint(arg0.target.latitude, arg0.target.longitude);
            getAddress(point);
            centerImageView.startAnimation(centerMarker);
            Log.e("load", "onCameraChangeFinish+获取后台数据");
        }
    }

    private int currentPage = 0;// 当前页面,从0开始计数
    private PoiSearch.Query query;// Poi查询条件类
    private PoiSearch poiSearch;// POI搜索

    @Override
    public void onAnimationStart(Animation animation) {
        centerImageView.setImageResource(R.mipmap.position);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        centerImageView.setImageResource(R.mipmap.position);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case 1:
                Log.e("load", "locate");
                aMap.animateCamera(CameraUpdateFactory.changeLatLng(new LatLng(
                        aLocation.getLatitude(), aLocation.getLongitude())));
                break;
            default:
                break;
        }
    }

    /**
     * 自定义infowinfow窗口,动态修改内容的
     */
    public void render(Marker marker, View view) {

    }

    // 点击非marker区域,将显示的InfoWindow隐藏
    @Override
    public void onMapClick(LatLng latLng) {
        if (currentMarker != null) {
            currentMarker.hideInfoWindow();
        }
    }

    private GeocodeSearch geocoderSearch;
    private ProgressDialog progDialog = null;

    /**
     * 响应逆地理编码
     */
    public void getAddress(final LatLonPoint latLonPoint) {
// showDialog();
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,
                GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
        geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
    }

    /**
     * 地理编码查询回调
     */
    @Override
    public void onGeocodeSearched(GeocodeResult result, int rCode) {
        dismissDialog();
        if (rCode == 0) {
            if (result != null && result.getGeocodeAddressList() != null
                    && result.getGeocodeAddressList().size() > 0) {
                GeocodeAddress address = result.getGeocodeAddressList().get(0);

            } else {
                ToastUtil.show(this, R.string.no_result);
            }

        } else if (rCode == 27) {
            ToastUtil.show(this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(this, R.string.error_key);
        } else {
            ToastUtil.show(this,
                    getString(R.string.error_other) + rCode);
        }
    }

    /**
     * 逆地理编码回调
     */
    @Override
    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
        dismissDialog();
        if (rCode == 0) {
            if (result != null && result.getRegeocodeAddress() != null
                    && result.getRegeocodeAddress().getFormatAddress() != null) {
                citycode = result.getRegeocodeAddress().getCityCode();
                if (isByItem) {
             
                    isByItem = false;
                } else {
                    doSearchQuery(citycode);
                }
            } else {
                ToastUtil.show(this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil.show(this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(this, R.string.error_key);
        } else {
            ToastUtil.show(this,
                    getString(R.string.error_other) + rCode);
        }
    }

    /**
     * 隐藏进度条对话框
     */
    public void dismissDialog() {
        if (progDialog != null) {
            progDialog.dismiss();
        }
    }

    /**
     * 关键词搜索
     */
    public void SearchPoi(String msg) {
  
        query = new PoiSearch.Query(msg, "地名地址信息|公司企业|公共设施|道路附属设施", citycode); // 第一个参数表示查询关键字,第二参数表示poi搜索类型,第三个参数表示城市区号或者城市名
        query.setPageNum(0);// 设置查询第几页,第一页从0开始
        query.setPageSize(10);// 设置每页返回多少条数据
        // 所有poi
        query.setLimitDiscount(false);
        query.setLimitGroupbuy(false);
        PoiSearch poiSearch = new PoiSearch(this, query);
        //设置搜索范围
        poiSearch.setBound(new PoiSearch.SearchBound(point, 50000, true));
        poiSearch.setOnPoiSearchListener(this);
        poiSearch.searchPOIAsyn();// 异步poi查询
    }


    /**
     * 开始进行poi搜索
     */
    protected void doSearchQuery(String cityCode) {

        aMap.setOnMapClickListener(null);// 进行poi搜索时清除掉地图点击事件
        currentPage = 0;
        query = new PoiSearch.Query("", "地名地址信息|公司企业|公共设施|道路附属设施", cityCode);
        //    query = new PoiSearch.Query("", deepType, "北京市");
        // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
        query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页

        // 所有poi
        query.setLimitDiscount(false);
        query.setLimitGroupbuy(false);

        if (point != null) {
            poiSearch = new PoiSearch(this, query);
            poiSearch.setOnPoiSearchListener(this);
            poiSearch.setBound(new SearchBound(point, 5000, true));//
            // 设置搜索区域为以lp点为圆心,其周围2000米范围
            poiSearch.searchPOIAsyn();// 异步搜索
        }
    }

    private PoiResult poiResult; // poi返回的结果
    private List<PoiItem> poiItems;// poi数据
    private ListView lvPoiList;

    /**
     * POI搜索回调方法
     */
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {

        if (rCode == 0) {
            if (result != null && result.getQuery() != null) {// 搜索poi的结果
                if (result.getQuery().equals(query)) {// 是否是同一条
                    poiResult = result;
                    if (null != poiItems) {
                        poiItems.clear();
                    }
                    poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始

                    Double lat = poiResult.getPois().get(0).getLatLonPoint().getLatitude();
                    Double lon = poiResult.getPois().get(0).getLatLonPoint().getLongitude();
                    if (isByContent) {
                        centerImageView.startAnimation(centerMarker);
                        aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(
                                lat, lon)));
                        CameraUpdateFactory.zoomTo(17);
                    }
                    DebugUtils.e("item--->" + poiItems.get(0).getSnippet());

                    adapter = new AddressAdapter(getApplicationContext(), poiItems);
                    lvPoiList.setAdapter(adapter);
                    List<SuggestionCity> suggestionCities = poiResult
                            .getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
                } else {
                    ToastUtil.show(this,
                            R.string.no_result);
                }
            } else {
                ToastUtil
                        .show(this, R.string.no_result);
            }
        } else if (rCode == 27) {
            ToastUtil
                    .show(this, R.string.error_network);
        } else if (rCode == 32) {
            ToastUtil.show(this, R.string.error_key);
        } else {
            ToastUtil.show(this,
                    getString(R.string.error_other) + rCode);
        }
    }


    @Override
    public void onLocationChanged(Location location) {
   
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        currentMarker = marker;
        return false;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        View infoWindow = getLayoutInflater().inflate(
                R.layout.custom_info_window, null);
        render(marker, infoWindow);
        return infoWindow;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

    @Override
    public void onInfoWindowClick(Marker marker) {

    }

}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值