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) { } }
高德地图仿微信实现发送位置
最新推荐文章于 2021-07-23 19:46:05 发布