Android 编程 高德地图 (实现显示地图以及定位功能)
Android 编程 高德地图 (实现显示地图以及定位功能)
本文参考文章:
http://www.apkbus.com/blog-904057-63610.html
本人实现的 定位代码:(具体配置省略,可见参考文章)
package com.example.demo.fuction; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; 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.AMapOptions; import com.amap.api.maps2d.CameraUpdateFactory; import com.amap.api.maps2d.MapView; import com.amap.api.maps2d.UiSettings; import com.amap.api.maps2d.model.BitmapDescriptor; import com.amap.api.maps2d.model.BitmapDescriptorFactory; import com.amap.api.maps2d.model.LatLng; import com.amap.api.maps2d.model.Marker; import com.amap.api.maps2d.model.MarkerOptions; import com.joe.ditudemo.R; import static com.amap.api.location.AMapLocationClientOption.AMapLocationMode.Hight_Accuracy; /** * Created by Joe. */ public class GetMyLocationActivity extends AppCompatActivity { //声明AMapLocationClient类对象 public AMapLocationClient mLocationClient = null; //声明mLocationOption对象 public AMapLocationClientOption mLocationOption = null; private double lat; private double lon; private MapView mapView; private AMap aMap;//地图控制器对象 private UiSettings mUiSettings; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_get_mylocation); //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener);//设置其为定位完成后的回调函数 mapView = (MapView) findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); init(); } /** * * 初始化AMap类对象 aMap 地图控制器 */ private void init() { if (aMap == null) { aMap = mapView.getMap();//地图控制器对象 mUiSettings = aMap.getUiSettings(); } //设置logo位置 mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER);//高德地图标志的摆放位置 mUiSettings.setZoomControlsEnabled(true);//地图缩放控件是否可见 mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM);//地图缩放控件的摆放位置 //aMap 为地图控制器对象 aMap.getUiSettings().setMyLocationButtonEnabled(true);//地图的定位标志是否可见 aMap.setMyLocationEnabled(true);//地图定位标志是否可以点击 setUpMap(); } /** * 配置定位参数 */ private void setUpMap() { //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 mLocationOption.setLocationMode(Hight_Accuracy); //设置是否返回地址信息(默认返回地址信息) mLocationOption.setNeedAddress(true); //设置是否只定位一次,默认为false mLocationOption.setOnceLocation(false); //设置是否允许模拟位置,默认为false,不允许模拟位置 mLocationOption.setMockEnable(false); //设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(2000); //给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption); //启动定位 mLocationClient.startLocation(); } public AMapLocationListener mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation amapLocation) { if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { Log.v("getLocationType", ""+amapLocation.getLocationType() ) ; lat = amapLocation.getLatitude(); lon = amapLocation.getLongitude(); Log.v("getAccuracy", ""+amapLocation.getAccuracy()+" 米");//获取精度信息 Log.v("joe", "lat :-- " + lat + " lon :--" + lon); Log.v("joe", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict()); //清空缓存位置 aMap.clear(); // 设置显示的焦点,即当前地图显示为当前位置 aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 18)); //aMap.moveCamera(CameraUpdateFactory.zoomTo(18)); //aMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lon))); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(new LatLng(lat, lon)); markerOptions.title("我的位置"); markerOptions.visible(true); BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.icon_location)); markerOptions.icon(bitmapDescriptor); markerOptions.draggable(true); Marker marker = aMap.addMarker(markerOptions); marker.showInfoWindow(); } else { //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 Log.e("joe", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } }; /** * 重新绘制加载地图 */ @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(); if (mLocationClient != null) { mLocationClient.stopLocation(); mLocationClient.onDestroy(); } mLocationClient = null; } }
以上代码亲测可行,不过有些不必要的设置没有加,下面给出一些没有加入的代码:
// 设置定位请求超时时间,默认为30秒 // 单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。 mLocationOption.setHttpTimeOut(50000); // 设置是否开启定位缓存机制 // 缓存机制默认开启,可以通过以下接口进行关闭。 // 当开启定位缓存功能,在高精度模式和低功耗模式下进行的网络定位结果均会生成本地缓存,不区分单次定位还是连续定位。GPS定位结果不会被缓存。 // 关闭缓存机制 mLocationOption.setLocationCacheEnable(false); // 设置是否只定位一次,默认为false mLocationOption.setOnceLocation(false); // 给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption);
上面的 setHttpTimeOut 方法 是设置定位请求协议中的 http 超时的情况下的超时时间, 这里个人认为这是采用Wifi定位设置时采用的交互协议。
mLocationOption.setOnceLocation(false); 该方法是设置 定位 是否是只定位一次 ,也或者是会连续定位。
mLocationOption.setLocationCacheEnable(false); 定位的缓存结果设置选项
本人所写的代码某次运行后 打印的定位类型信息如下:
个人估计, 如果设置缓存后, APP 会把定位信息写到缓存中, APP再次运行后如果在某个设定的时间内缓存中有定位信息则会先读取缓存中的定位信息。
由于 本人做试验的时候是在室内, gps定位效果不佳于是默认转为了 wifi定位, 这时候提示的定位信息为 5 。
然后由于后面的定位都是连续的比较紧,在2000ms左右就又一次请求定位, 而且并没有水平移动(手机的位移传感器可以度量),于是直接采用前次的定位信息,这时的定位类型为 2 。