Android 高德地图入门详解

    xiaoxiao2025-11-18  1

    效果图:

    教程: 由于官网的教程不是很详细,相信很多小白们有点看不懂,比如我,看的都是一脸懵逼,相比较而言,百度地图的教程要更详细一点!推荐新手先拿百度教程来练练手,熟悉下地图的业务逻辑,地图类逻辑都差不多,好了不多说,开始正文。 首先,去高德官网下载所需的地图库并申请key,附:http://lbs.amap.com/ 下载的jar包导入到as里面,然后配置清单文件:

    权限: <!--地图包、搜索包需要的基础权限--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--定位包、导航包需要的额外权限(注:基础权限也需要)--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--服务必须有!否则定位时候报错误,错误代码10--> <service android:name="com.amap.api.location.APSService"></service> <meta-data android:name="com.amap.api.v2.apikey" android:value="这里是你对应的key"> </meta-data> </application>

    在xml布局文件中引用地图控件(注意!这里的引入的MapView路径是“com.amap.api.maps2d.MapView”,官网地图那里应该是3d包里的是“com.amap.api.maps.MapView”,如果下载sdk里面不包含3d视图的可能应用会报错!!!):

    <com.amap.api.maps2d.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" />

    在activity中引用:

    //获取地图控件引用 mMapView = (MapView) findViewById(R.id.map); //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理 mMapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mMapView.getMap(); //UiSettings 主要是对地图上的控件的管理,比如指南针、logo位置(不能隐藏)..... UiSettings settings = aMap.getUiSettings(); //设置了定位的监听,这里要实现LocationSource接口 aMap.setLocationSource(this); // 是否显示定位按钮(据我所知不能更改,知道的麻烦告我一声) settings.setMyLocationButtonEnabled(true); //添加指南针 //settings.setCompassEnabled(true); //aMap.getCameraPosition(); 方法可以获取地图的旋转角度 //管理缩放控件 settings.setZoomControlsEnabled(true); //设置logo位置,左下,底部居中,右下(隐藏logo:settings.setLogoLeftMargin(9000)) settings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT); //设置显示地图的默认比例尺 settings.setScaleControlsEnabled(true); //每像素代表几米 //float scale = aMap.getScalePerPixel(); aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase } //开始定位 location();

    location()方法里面主要就是设置一下定位的参数:

    //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(this); //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位模式为Hight_Accuracy高精度模式,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();

    另外当前activity需要实现LocationSource与AMapLocationListener,并实现3个方法:

    /** * 定位成功后回调函数 */ @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { //可在其中解析amapLocation获取相应内容。 aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表 lat = aMapLocation.getLatitude();//获取纬度 lon = aMapLocation.getLongitude();//获取经度 aMapLocation.getAccuracy();//获取精度信息 aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。 aMapLocation.getCountry();//国家信息 aMapLocation.getProvince();//省信息 aMapLocation.getCity();//城市信息 aMapLocation.getDistrict();//城区信息 aMapLocation.getStreet();//街道信息 aMapLocation.getStreetNum();//街道门牌号信息 aMapLocation.getCityCode();//城市编码 aMapLocation.getAdCode();//地区编码 aMapLocation.getAoiName();//获取当前定位点的AOI信息 //获取定位时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(aMapLocation.getTime()); df.format(date); // 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置 if (isFirstLoc) { //设置缩放级别(缩放级别为4-20级) aMap.moveCamera(CameraUpdateFactory.zoomTo(zoomlevel)); //将地图移动到定位点 aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()))); //点击定位按钮 能够将地图的中心移动到定位点 mListener.onLocationChanged(aMapLocation); //获取定位信息 StringBuffer buffer = new StringBuffer(); buffer.append(aMapLocation.getCountry() + "" + aMapLocation.getProvince() + "" + aMapLocation.getCity() + "" + aMapLocation.getProvince() + "" + aMapLocation.getDistrict() + "" + aMapLocation.getStreet() + "" + aMapLocation.getStreetNum()); Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show(); isFirstLoc = false; } }else { //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 Log.e("地图错误","定位失败, 错误码:" + aMapLocation.getErrorCode() + ", 错误信息:" + aMapLocation.getErrorInfo()); } } } @Override public void activate(OnLocationChangedListener onLocationChangedListener) { mListener = onLocationChangedListener; } @Override public void deactivate() { mListener = null; }

    然后在activity的生命周期方法里添加地图相应的声明周期方法就行了:

    @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); mLocationClient.stopLocation();//停止定位 mLocationClient.onDestroy();//销毁定位客户端。 } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理 mMapView.onSaveInstanceState(outState); }

    如果想要自定义定位功能,只需要调用aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(纬度,经度),缩放级别))就可以了(这些在下面的源码里面写的很清楚)(注:缩放级别为4-20级)

    源码下载:点击免费下载

    转载请注明原文地址: https://ju.6miu.com/read-1304315.html
    最新回复(0)