android studio 安卓集成高德地圖獲取app定位信息

在網上搜索過大量集成高德地圖的方案,和測試代碼,要麼就是博主抄來沒有測試過的代碼,要麼就是步驟不連續的,甚至包裹官網給出的解決方案都是欠缺相關步驟的(官網截圖都不知道多少年前的了,沒更新過),不斷碰碰磕磕地試錯,結合大量的博客的步驟,本身親測實現了集成高德地址sdk並使用來獲取app的定位地址。

1、新建空項目

這個自行百度,so easy,絕對不會出錯的。java

2、高德地圖申請key

1.高德官網:https://lbs.amap.com/

步驟流程:依次進入-》控制檯-》應用管理-》建立新應用-》添加新key
圖片描述android

clipboard.png

2.填寫信息

key名稱隨意寫,無關要緊
發佈版本安全碼SHA1請看下一步
clipboard.pngjson

3.查看包名

若是在新建安卓項目的時候忘記包名,能夠經過AndroidManifest.xml文件來查看api

clipboard.png

4.安全碼的獲取

4.1 首先須要在Android Studio上生成jks密鑰,能夠參考這個博客https://blog.csdn.net/yy13003...,靠譜親測無誤。

可是舒適提醒一下,來到如下截圖的步驟時,請記住這些信息(或者跟我同樣截圖記錄):
key store path路徑 和 Password密碼,以及 Alias 別名和Password密碼,
這幾個信息在後面須要代碼配置時用上的,這個細節甚至在高德官網都沒有給出任何提示給步驟,在這我也卡了好久。
clipboard.png緩存

4.2 在確保已經生成了jks密鑰後,經過Android Studio打開Treminal終端輸入:
keytool -v -list -keystore xxxx.jks(jks的路徑)

第三步就是你的安全SHA1碼
圖片描述安全

3、集成高德SDK

1. 下載jar包

官網地址:http://lbs.amap.com/api/andro...
下載解壓放置lis目錄中,在這特別注意須要添加進入環境變量中(不少博客不說明,對於我這小白太坑了)
添加jar包入環境變量:右鍵jar包-》Add As Library...(詳情操做參考:https://blog.csdn.net/s499820...
圖片描述網絡

2.配置build.gradle

這個配置不少博客都沒有提到的,很坑爹。以後在後面排查問題才搜索到這個博客說明,能夠參考(https://blog.csdn.net/zrf1335...
這裏的四個信息storeFile file/storePassword/keyAlias/keyPassword就對應上面在成功jks時的四個信息了app

signingConfigs {
        //調試版的keystore
        debug {
            storeFile file("/Users/dfp/AndroidStudioProjects/demoProj/demoproj.jks")
            storePassword "123456"
            keyAlias "demoproj"
            keyPassword "123456"
        }
        //發佈版的keystore
        release {
            storeFile file("/Users/dfp/AndroidStudioProjects/demoProj/demoproj.jks")
            storePassword "123456"
            keyAlias "demoproj"
            keyPassword "123456"
        }
    }

clipboard.png

4、測試代碼獲取定位

這裏代碼能夠參考博客https://blog.csdn.net/code_be...ide

1. 配置

官網示例配置:https://lbs.amap.com/api/andr...測試

官網示例截圖,須要注意的是,<meta-data android:name="com.amap.api.v2.apikey" android:value="您的key"></meta-data>,value值裏面須要添加你在上面第二步驟生氣的key
clipboard.png

個人完整配置示例

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dfp.demoproj">

    <uses-permission android:name="android.permission.INTERNET" />
    <!--用於進行網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--用於訪問GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!--獲取運營商信息,用於支持提供運營商信息相關的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!--用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!--這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!--用於訪問網絡,網絡定位須要上網-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <!--用於讀取手機當前的狀態-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!--寫入擴展存儲,向擴展卡寫入數據,用於寫入緩存定位數據-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--用於申請調用A-GPS模塊-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <!--用於申請獲取藍牙信息進行室內定位-->
    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        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">
        <meta-data android:name="com.amap.api.v2.apikey" android:value="XXXXXXXXXX"></meta-data>
        <service android:name="com.amap.api.location.APSService"></service>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".LongRunningService">
        </service>
        <receiver android:name=".AlarmReceiver">
        </receiver>
    </application>

</manifest>

2.測試代碼

在MainActivity.java上照搬別人的測試代碼便可,官方案例我是在不會用

我抄的代碼示例

package com.example.dfp.demoproj;

import android.support.v7.app.AppCompatActivity;
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;

public class MainActivity extends AppCompatActivity {
    //聲明AMapLocationClient類對象
    public AMapLocationClient mLocationClient = null;
    //聲明定位回調監聽器
    public AMapLocationListener mLocationListener = new MyAMapLocationListener();
    //聲明AMapLocationClientOption對象
    public AMapLocationClientOption mLocationOption = null;


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

        init();
    }

    private void init() {
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //設置定位回調監聽
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption對象
        mLocationOption = new AMapLocationClientOption();
        //設置定位模式爲AMapLocationMode.Hight_Accuracy,高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //獲取一次定位結果:
        //該方法默認爲false。
        mLocationOption.setOnceLocation(false);

        //獲取最近3s內精度最高的一次定位結果:
        //設置setOnceLocationLatest(boolean b)接口爲true,啓動定位時SDK會返回最近3s內精度最高的一次定位結果。若是設置其爲true,setOnceLocation(boolean b)接口也會被設置爲true,反之不會,默認爲false。
        mLocationOption.setOnceLocationLatest(true);
        //設置是否返回地址信息(默認返回地址信息)
        mLocationOption.setNeedAddress(true);
        //設置是否容許模擬位置,默認爲false,不容許模擬位置
        mLocationOption.setMockEnable(false);
        //關閉緩存機制
        mLocationOption.setLocationCacheEnable(false);
        //給定位客戶端對象設置定位參數
        mLocationClient.setLocationOption(mLocationOption);
        //啓動定位
        mLocationClient.startLocation();

    }

    private class MyAMapLocationListener implements AMapLocationListener {

        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    Log.e("位置:", aMapLocation.getAddress());
                } else {
                    //定位失敗時,可經過ErrCode(錯誤碼)信息來肯定失敗的緣由,errInfo是錯誤信息,詳見錯誤碼錶。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    }
}

5、運行測試結果

運行你的代碼在虛擬機(最好的真實機,我用得就是真實機測試)
Android Studio打印獲取到的定位信息:

clipboard.png

相關文章
相關標籤/搜索