如果地图功能随处可见,应用很广,这里利用高德地图的SDK来实现地图的显示以及定位功能。如需要详细了解参考官网信息/api/android-sdk/summary
使用高德地图你还得需要一个key。注册一个高德地图账号,在开发者平台进入右上角的控制台,在应用管理中新建一个应用就可以获取到key了。
首先官网下载SDK包/api/android-sdk/download,如果你下载的是2D地图则只有一个jar包,拷贝放入项目的libs文件夹里面,右键选择add as library即可。如果是3D包的话,则里面除了一个jar还有相关的so文件,你不仅要导入jar还得导入相关so文件。在main文件夹下建一个jnilibs文件夹,把所有的so文件放进去即可。如图
然后注册文件中加个meta-data,里面的name是固定的,但是value是你获取的key。加相关权限,权限有点多,管它有没有用,都加上。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.gdmap"><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" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!--value处加上自己申请的key--><meta-dataandroid:name="com.amap.api.v2.apikey"android:value="1bfdd3600775f90d9953ca0351836006"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
布局文件中写一个地图视图
<com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"/>
然后是主活动,只要你将调用了mapview.oncreate方法,地图就能显示出来,其他的都是定位相关的操作,代码中都有说明。
package com.example.gdmap;import android.os.Bundle;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.maps.AMap;import com.amap.api.maps.LocationSource;import com.amap.api.maps.MapView;import com.amap.api.maps.UiSettings;public class MainActivity extends AppCompatActivity implements LocationSource,AMapLocationListener{MapView mapView=null;//地图视图AMap aMap;//地图对象OnLocationChangedListener mlistener;//定位监听AMapLocationClient client;//定位者AMapLocationClientOption option;//定位参数@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView= (MapView) findViewById(R.id.map);mapView.onCreate(savedInstanceState);//创建地图init();}public void init(){aMap=mapView.getMap();//获取地图对象UiSettings settings=aMap.getUiSettings();//获取定位按钮aMap.setLocationSource(this);//设置定位监听settings.setMyLocationButtonEnabled(true);//显示定位按钮aMap.setMyLocationEnabled(true);//显示定位层并可触发定位}//activate初始化定位@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {mlistener=onLocationChangedListener;client=new AMapLocationClient(this);client.setLocationListener(this);//定位回调监听option=new AMapLocationClientOption();option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//高进度定位client.setLocationOption(option);//加载定位参数client.startLocation();//开始定位}//deactivate停止定位@Overridepublic void deactivate() {mlistener = null;if (client != null) {client.stopLocation();client.onDestroy();}client = null;}//定位成功后回调函数@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if(mlistener!=null){if(aMapLocation!=null&&aMapLocation.getErrorCode()==0){Log.e("经度: ", String.valueOf(aMapLocation.getLatitude()));Log.e("纬度: ", String.valueOf(aMapLocation.getLongitude()));Log.e("地址:",aMapLocation.getAddress());mlistener.onLocationChanged(aMapLocation);}else Log.e("定位结果","定位失败");}}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();if(client!=null) client.onDestroy();}}
这样定位有点bug,首先它默认隔两秒就定位一次,一直在定位,有时候我们只需要定位一次或让它在指定的时候就开始定位。查阅相关文档后发现两个AmaplocaionClientoption中的方法,设置时间间隔setInterval,设置只定位一次setOnceLocation。 还有就是只有第一次定位成功,其他时候都定位失败,错误码为10,这个错误码是启动服务失败。因为没手动加服务。加上定位服务即可。
<service android:name="com.amap.api.location.APSService"></service>
最后来一张效果图