手把手教你高德基礎地圖+定位+設置Marker實現

一、基礎地圖部分

1.獲取APPKey

在高德地圖註冊開發者賬號,然後創建應用,使用SHA1和PackageName得到Key

創建應用的鏈接:http://lbs.amap.com/


創建應用  輸入你的應用名稱 選擇你的應用類型 點擊確定


點擊確定之後得到這麼一個東西點擊添加新key  輸入完畢後再下方點擊提交   獲取SHA1值以及應用包名見下方


獲取SHA1值方法:
首先使用cmd 打開dos窗口


輸入cd .android 切換到 .android目錄

使用keytool工具獲取簽名的SHA1值 輸入命令:keytool -list -v -keystore debug.keystore 祕鑰口令輸入 android 或者直接回車


這裏的指紋整數有MD5、SHA1、SHA256 這樣就拿到了上面需要的SHA1值

獲取應用包名:
打開你的gradle文件


這就是你的應用包名


提交之後得到的AppKey:

2.下載SDK

下載地址:http://lbs.amap.com/api/android-sdk/down/


定位SDK下載地址:http://lbs.amap.com/api/android-location-sdk/download/

3.導入項目

把下載下來的壓縮包解壓,裏面的jar包放到項目的libs目錄下

然後Add As Library
集成高德地圖需要用到.so文件    解壓得到的.so文件 目錄裏面就是所需的.so文件
在main目錄下創建jniLibs目錄 注意是main目錄    解壓得到的.so文件連帶目錄都copy到jniLibs目錄下


4.配置清單文件

在AndroidManifest.xml裏面添加你的AppKey

<meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="99ac75ad4aa47d9b865cee7c3ef31a89"/>

在AndroidManifest.xml中添加用戶權限

//地圖包、搜索包需要的基礎權限
    <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" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>




配置Service

<service android:name="com.amap.api.location.APSService"/>


5.佈局文件:

在佈局文件中添加地圖控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="demo.gaode.com.gaodemapdemo.ShowMapActivity">

    <!-- 引入佈局文件 -->
    <com.amap.api.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

6.正式開始寫代碼了

1.基礎地圖顯示

效果圖


初始化地圖控件 管理地圖控件生命週期
package demo.gaode.com.gaodemapblog;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.amap.api.maps.MapView;

public class ShowMapActivity extends AppCompatActivity {

    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_map);
        //初始化地圖控件
        mapView = (MapView) findViewById(R.id.map);
        //必須要寫
        mapView.onCreate(savedInstanceState);
    }

    /**
     * 方法必須重寫
     */
    @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();
    }
}

2.定位功能實現

效果圖以及Log


效果圖和基礎地圖的效果圖沒什麼區別,因爲我既沒有設置中心點也沒有設置marker,但是我獲取到了位置,那麼定位完畢後添加一箇中心點,一個marker就可以完成基礎地圖+定位+marker的效果了

先把定位的所有代碼貼出來
package demo.gaode.com.gaodemapblog;

import android.app.Activity;
import android.os.Bundle;
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.MapView;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ShowMapActivity extends Activity {

    private MapView mapView;
    private AMap aMap;

    //聲明AMapLocationClient類對象
    public AMapLocationClient mLocationClient = null;


    //聲明定位回調監聽器
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    //定位成功回調信息,設置相關消息
                    amapLocation.getLocationType();//獲取當前定位結果來源,如網絡定位結果,詳見定位類型表
                    amapLocation.getLatitude();//獲取緯度
                    amapLocation.getLongitude();//獲取經度
                    amapLocation.getAccuracy();//獲取精度信息
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(amapLocation.getTime());
                    df.format(date);//定位時間
                    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信息
                    lat = amapLocation.getLatitude();
                    lon = amapLocation.getLongitude();
                    Log.v("pcw","lat : "+lat+" lon : "+lon);

                } else {
                    //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + amapLocation.getErrorCode() + ", errInfo:"
                            + amapLocation.getErrorInfo());
                }
            }
        }
    };

    //聲明mLocationOption對象
    public AMapLocationClientOption mLocationOption = null;
    private double lat;
    private double lon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_map);

        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);//必須要寫

        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //設置定位回調監聽
        mLocationClient.setLocationListener(mLocationListener);

        init();

    }

    /**
     * * 初始化AMap對象
     */
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
        }

        setUpMap();

    }

    private void setUpMap() {
        //初始化定位參數
        mLocationOption = new AMapLocationClientOption();
        //設置定位模式爲高精度模式,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();
    }


    /**
     * 方法必須重寫
     */
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mLocationClient.stopLocation();//停止定位
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
        mLocationClient.onDestroy();//銷燬定位客戶端。
    }

}

這裏面有一個地方千萬要記住,一定要在AndroidManifest.xml中註冊廣播  否則定位會失敗
<service android:name="com.amap.api.location.APSService"/>
下面來講講這段代碼裏面幾個組成:
初始化定位
//初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //設置定位回調監聽
        mLocationClient.setLocationListener(mLocationListener);
初始化AMap對象
/**
     * * 初始化AMap對象
     */
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
        }

        setUpMap();

    }
配置定位參數並開始定位
/**
     * 配置定位參數
     */
    private void setUpMap() {
        //初始化定位參數
        mLocationOption = new AMapLocationClientOption();
        //設置定位模式爲高精度模式,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();
    }
在onStop裏面停止定位
 @Override
    protected void onStop() {
        super.onStop();
        mLocationClient.stopLocation();//停止定位
    }

在onDestory方法裏面銷燬定位
/**
     * 方法必須重寫
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
        mLocationClient.onDestroy();//銷燬定位客戶端。
    }

設置定位監聽,在監聽中可以獲取定位的一系列數據
/**
     * 聲明定位回調監聽器
     */
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    //定位成功回調信息,設置相關消息
                    amapLocation.getLocationType();//獲取當前定位結果來源,如網絡定位結果,詳見定位類型表
                    amapLocation.getLatitude();//獲取緯度
                    amapLocation.getLongitude();//獲取經度
                    amapLocation.getAccuracy();//獲取精度信息
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(amapLocation.getTime());
                    df.format(date);//定位時間
                    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信息
                    lat = amapLocation.getLatitude();
                    lon = amapLocation.getLongitude();
                    Log.v("pcw","lat : "+lat+" lon : "+lon);

                } else {
                    //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + amapLocation.getErrorCode() + ", errInfo:"
                            + amapLocation.getErrorInfo());
                }
            }
        }
    };

3.設置中心點以及marker

效果圖


有了效果圖  那麼我把基礎地圖+定位+marker的代碼貼出來
package demo.gaode.com.gaodemapblog;

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
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.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ShowMapActivity extends Activity {

    private MapView mapView;
    private AMap aMap;

    //聲明AMapLocationClient類對象
    public AMapLocationClient mLocationClient = null;


    /**
     * 聲明定位回調監聽器
     */
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    //定位成功回調信息,設置相關消息
                    amapLocation.getLocationType();//獲取當前定位結果來源,如網絡定位結果,詳見定位類型表
                    amapLocation.getLatitude();//獲取緯度
                    amapLocation.getLongitude();//獲取經度
                    amapLocation.getAccuracy();//獲取精度信息
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(amapLocation.getTime());
                    df.format(date);//定位時間
                    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信息
                    lat = amapLocation.getLatitude();
                    lon = amapLocation.getLongitude();
                    Log.v("pcw", "lat : " + lat + " lon : " + lon);
                    Log.v("pcw", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict());

                    // 設置當前地圖顯示爲當前位置
                    aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 19));
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(new LatLng(lat, lon));
                    markerOptions.title("當前位置");
                    markerOptions.visible(true);
                    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.location_marker));
                    markerOptions.icon(bitmapDescriptor);
                    aMap.addMarker(markerOptions);

                } else {
                    //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + amapLocation.getErrorCode() + ", errInfo:"
                            + amapLocation.getErrorInfo());
                }
            }
        }
    };

    //聲明mLocationOption對象
    public AMapLocationClientOption mLocationOption = null;
    private double lat;
    private double lon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_map);

        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);//必須要寫

        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //設置定位回調監聽
        mLocationClient.setLocationListener(mLocationListener);

        init();

    }

    /**
     * * 初始化AMap對象
     */
    private void init() {
        if (aMap == null) {
            aMap = mapView.getMap();
        }

        setUpMap();

    }

    /**
     * 配置定位參數
     */
    private void setUpMap() {
        //初始化定位參數
        mLocationOption = new AMapLocationClientOption();
        //設置定位模式爲高精度模式,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();
    }


    /**
     * 方法必須重寫
     */
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mLocationClient.stopLocation();//停止定位
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必須重寫
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
        mLocationClient.onDestroy();//銷燬定位客戶端。
    }

}

代碼實際上沒什麼難度,也不多,下面我把設置marker的代碼貼出來
// 設置當前地圖顯示爲當前位置
                    aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 19));
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(new LatLng(lat, lon));
                    markerOptions.title("當前位置");
                    markerOptions.visible(true);
                    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.location_marker));
                    markerOptions.icon(bitmapDescriptor);
                    aMap.addMarker(markerOptions);


好了,到這裏 基礎地圖+定位+marker就做出來了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章