android 百度地图选择地址并再通过坐标获取地址

来源:互联网 发布:linux下nslookup 编辑:程序博客网 时间:2024/05/17 03:09

应用有考勤功能,但测试人员又总是在公司,测试不了考勤变化,于是为测试开发一个界面可以在测试时选择地址相当于定位。

查了一下百度API并未查到,但试了一下,结果在 MapStatusChangeListener的回调找到MapStatus,其中包含了拖动地图时的中间的位置,就可以在地图选择地址了,从而MapStatus里得到经纬度。再通过经纬度得到具体的地址详情(注:要签名打包才能得到地址)。

代码如下:

import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BaiduMap.OnMapLoadedCallback;import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.SearchResult;import com.baidu.mapapi.search.geocode.GeoCodeResult;import com.baidu.mapapi.search.geocode.GeoCoder;import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import com.xinyan.quanminsale.R;import com.xinyan.quanminsale.client.comm.helper.LocationHeleper;import com.xinyan.quanminsale.framework.util.ToastUtils;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;// 测试mm要用的public class ControlMapActivity extends Activity implements OnClickListener {private MapView mMapView;private BaiduMap mBaiduMap;private double mLatitude, mLongitude;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.h_activity_control_map);mLatitude = LocationHeleper.getInstance().getLatitude();mLongitude = LocationHeleper.getInstance().getLongitude();mMapView = (MapView) findViewById(R.id.mv_control_mapview);mBaiduMap = mMapView.getMap();mBaiduMap.setMyLocationEnabled(true);MarkerOptions mMarkerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_map));final LatLng ll = new LatLng(Double.valueOf(mLatitude), Double.valueOf(mLongitude));mMarkerOptions.position(ll);mBaiduMap.addOverlay(mMarkerOptions);MapStatus.Builder builder = new MapStatus.Builder();builder.target(ll).zoom(18.0f);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));mBaiduMap.setOnMapLoadedCallback(new OnMapLoadedCallback() {@Overridepublic void onMapLoaded() {}});mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {@Overridepublic void onMapStatusChangeStart(MapStatus arg0) {}@Overridepublic void onMapStatusChangeFinish(MapStatus arg0) {LocationHeleper.getInstance().setMapStatus(arg0);//arg0.target.latitude  // 纬度//arg0.target.longitude // 经度latlngToAddress(arg0.target);}@Overridepublic void onMapStatusChange(MapStatus arg0) {}});findViewById(R.id.iv_control_map_back).setOnClickListener(this);}// 百度地图通过坐标获取地址,( 要签名打包才能得到地址)private void latlngToAddress(LatLng latlng) {GeoCoder geoCoder = GeoCoder.newInstance();// 设置反地理经纬度坐标,请求位置时,需要一个经纬度geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latlng));// 设置地址或经纬度反编译后的监听,这里有两个回调方法geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {ToastUtils.showText("找不到该地址!");} else {ToastUtils.showText(result.getAddress());}}@Overridepublic void onGetGeoCodeResult(GeoCodeResult result) {// 详细地址转换在经纬度ToastUtils.showText(result.getAddress());}});}protected void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mBaiduMap.setMyLocationEnabled(false);mMapView.onDestroy();mMapView = null;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.iv_control_map_back:finish();break;}}}

附加一下定位代码:

import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;import com.xinyan.quanminsale.framework.base.BaseApplication;import com.xinyan.quanminsale.framework.log.LogUtil;import android.text.TextUtils;public class LocationHeleper {private static volatile LocationHeleper mHelper;private LocationClient locationClient;private boolean isStart = false;private double latitude;private double longitude;private String mAddress;private String city;private String cityCode;;private boolean isLocation = false;private LocationHeleper() {locationClient = new LocationClient(BaseApplication.mContext);locationClient.registerLocationListener(new BDLocationListener() {@Overridepublic void onReceiveLocation(BDLocation arg0) {String address = arg0.getAddrStr();if (!TextUtils.isEmpty(address)) {latitude = arg0.getLatitude();longitude = arg0.getLongitude();mAddress = address;city = arg0.getCity();cityCode = arg0.getCityCode();isLocation = true;}LogUtil.i("LocationHeleper", "latitude :" + latitude);LogUtil.i("LocationHeleper", "longitude :" + longitude);LogUtil.i("LocationHeleper", "mAddress :" + mAddress);}});LocationClientOption option = new LocationClientOption();// option.setCoorType("gcj02");// 返回的定位结果是百度经纬度,默认值gcj02option.setIsNeedAddress(true);// 位置,一定要设置,否则后面得不到地址option.setOpenGps(true);// 打开GPSoption.setScanSpan(LocationClientOption.MIN_SCAN_SPAN * 60);// 多长时间进行一次请求option.setLocationMode(LocationMode.Hight_Accuracy);// 高精度locationClient.setLocOption(option);// 使用设置}public static LocationHeleper getInstance() {if (mHelper == null) {mHelper = new LocationHeleper();}return mHelper;}public String getCity() {return city;}public String getCityCode() {return cityCode;}public synchronized void starLocation() {if (!isStart) {locationClient.start();isStart = true;}}public synchronized void stopLocation() {if (locationClient != null)locationClient.stop();}public double getLatitude() {return latitude;}public double getLongitude() {return longitude;}public String getAddress() {return mAddress;}public boolean isLocation() {return isLocation;}}


原创粉丝点击