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

若是地图功能随处可见,应用很广,这里利用高德地图的SDK来实现地图的显示以及定位功能。如须要详细了解参考官网信息http://lbs.amap.com/api/android-sdk/summaryhtml

使用高德地图你还得须要一个key。注册一个高德地图帐号,在开发者平台 进入右上角的控制台,在应用管理中新建一个应用就能够获取到key了。java

首先官网下载SDK包http://lbs.amap.com/api/android-sdk/download,若是你下载的是2D地图则只有一个jar包,拷贝放入项目的libs文件夹里面,右键选择add as library便可。若是是3D包的话,则里面除了一个jar还有相关的so文件,你不只要导入jar还得导入相关so文件。在main文件夹下建一个jnilibs文件夹,把全部的so文件放进去便可。如图android


而后注册文件中加个meta-data,里面的name是固定的,可是value是你获取的key。加相关权限,权限有点多,管它有没有用,都加上。git

<?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>

布局文件中写一个地图视图api

<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>

最后来一张效果图app