您的位置:首页 > 其它

高德地图开发(一)显示地图与定位

2017-10-01 17:48 671 查看
如果地图功能随处可见,应用很广,这里利用高德地图的SDK来实现地图的显示以及定位功能。如需要详细了解参考官网信息http://lbs.amap.com/api/android-sdk/summary
使用高德地图你还得需要一个key。注册一个高德地图账号,在开发者平台 进入右上角的控制台,在应用管理中新建一个应用就可以获取到key了。


首先官网下载SDK包http://lbs.amap.com/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="http://schemas.android.com/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" />

<application
android: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-data
android: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.MapView
android: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;//定位参数

@Override
protected 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初始化定位
@Override
public 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停止定位
@Override
public void deactivate() {
mlistener = null;
if (client != null) {
client.stopLocation();
client.onDestroy();
}
client = null;
}

//定位成功后回调函数
@Override
public 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("定位结果","定位失败");
}
}

@Override
protected 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>

最后来一张效果图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息