Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 試水高德LBS開放平台-HelloWord(文末小彩蛋)

試水高德LBS開放平台-HelloWord(文末小彩蛋)

編輯:關於Android編程

這次我們試水高德LBS開放平台,

那麼,什麼是LBS?

基於位置的服務,它是通過電信移動運營商的無線電通訊網絡(如GSM網、CDMA網)或外部定位方式(如GPS)獲取移動終端用戶的位置信息,在地理信息系統平台的支持下,為用戶提供相應服務的一種增值業務。

簡介下高德LBS開放平台:

\

Android 定位SDK最新版本為V2.8.0,包含全球定位功能。
Android 定位 SDK 是一套簡單的LBS服務定位接口,您可以使用這套定位API獲取定位結果、逆地理編碼(地址文字描述)、以及地理圍欄功能。

 

配置工程,申請Key:

http://lbs.amap.com/,注冊賬號並填寫開發者信息,通過SHA1和包名獲取key。

\

Key名稱按命名規范來,

規范命名會讓數據統計和數據分析更准確

建議命名方式:[應用名 + 應用場景]

如:神州專車-司機端;神州專車-Demo等

Package對應你應用的包名:

打開Android 應用工程的 AndroidManifest.xml配置文件,package 屬性所對應的內容為應用包名。

SHA1的查看:

 

獲取SHA1值

首先,絕大多數App在調試時使用的簽名文件(debug keystore)和最終App發布使用的簽名文件(自定義的keystore)是不同的,不同簽名文件的SHA1值也是不同的。下面提供幾種獲取SHA1值的方式:

通過Eclipse編譯器獲取SHA1

使用 adt 22 以上版本,可以在 eclipse 中直接查看。

Windows:依次在 eclipse 中打開 Window -> Preferances -> Android -> Build。

Mac:依次在 eclipse 中打開 Eclipse/ADT->Preferances -> Android -> Build。

在彈出的 Build 對話框中 “SHA1 fingerprint” 中的值即為 Android 簽名證書的 Sha1 值,如下圖所示:

SHA1 fingerprint

通過Android Studio編譯器獲取SHA1

第一步、打開Android Studio的Terminal工具

第二步、輸入命令:keytool -v -list -keystore keystore文件路徑

第三步、輸入Keystore密碼

SHA1 fingerprint

使用 keytool(jdk自帶工具)獲取SHA1

1.運行進入控制台。

控制台

2.在彈出的控制台窗口中輸入 cd .android 定位到 .android 文件夾。(我的路徑為:C:\Users\car\.android\debug.keystore,僅供參考;最好的方法是全局搜索)

.android 文件夾

3.繼續在控制台輸入命令。

debug.keystore:命令為:keytool -list -v -keystore debug.keystore

自定義的 keystore:命令為:keytool -list -v -keystore apk的keystore

如下所示:
繼續在控制台輸入命令

提示輸入密鑰庫密碼,編譯器提供的debug keystore默認密碼是 android,自定義簽名文件的密碼請自行填寫。輸入密鑰後回車(如果沒設置密碼,可直接回車),此時可在控制台顯示的信息中獲取 SHA1 值,如下圖所示:
Sha1 值

說明:keystore 文件為 Android 簽名證書文件。

 

 

Android Studio 配置工程 1、新建一個 Empty Activity 的應用項目,您可參考入門指南<創建工程>章節創建一個 Android 工程。

 

2、將下載的定位SDK的jar包復制到libs目錄下,如果有老版本定位jar包在其中,請刪除。如圖所示:

高德地圖工程配置

添加高德 Key

為了保證高德 Android SDK 的功能正常使用,您需要申請高德 Key 並且配置到項目中。

項目的 “AndroidManifest.xml” 文件中,添加如下代碼:


         
            ……
然後添加聯網等相應權限,見demo。

 

    
    
    
    
    
    
    
    
    
    
    
    
    
    
   
    
    
    
    
    
    
   
    
    
     
    
    
    
    
    
    
    

 

 

代碼混淆

 

在生成 apk 進行代碼混淆時進行如下配置(如果報出 warning,在報出 warning 的包加入類似的語句:-dontwarn 包名)

    3D 地圖
    -keep   class com.amap.api.mapcore.**{*;} 
    -keep   class com.amap.api.maps.**{*;} 
    -keep   class com.autonavi.amap.mapcore.*{*;} 

    定位
    -keep class com.amap.api.location.**{*;}
    -keep class com.amap.api.fence.**{*;}
    -keep class com.autonavi.aps.amapapi.model.**{*;}

    搜索
    -keep   class com.amap.api.services.**{*;}

    2D地圖
    -keep class com.amap.api.maps2d.**{*;}
    -keep class com.amap.api.mapcore2d.**{*;}

    導航
    -keep class com.amap.api.navi.**{*;}
    -keep class com.autonavi.**{*;}

 

接下來是自由開發時間~

 

獲取定位數據

 

獲取定位數據之前,需要在 AndroidManifest.xml 文件中進行權限設置,確保定位功能可以正常使用。

第 1 步,配置AndroidManifest.xml

首先,聲明Service組件

請在application標簽中聲明service組件,每個app擁有自己單獨的定位service。

1

然後,聲明權限

Android 6.0及以上系統可以參考Android 6.0權限說明章節。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

最後,設置高德Key

在application標簽中加入:

1 2 3 //開發者申請的key

第 2 步,初始化定位

請在主線程中聲明AMapLocationClient類對象,需要傳Context類型的參數。推薦用getApplicationConext()方法獲取全進程有效的context。

1 2 3 4 5 6 7 8 //聲明AMapLocationClient類對象 public AMapLocationClient mLocationClient =null; //聲明定位回調監聽器 public AMapLocationListener mLocationListener =new AMapLocationListener(); //初始化定位 mLocationClient =new AMapLocationClient(getApplicationContext()); //設置定位回調監聽 mLocationClient.setLocationListener(mLocationListener);

第 3 步,配置參數並啟動定位

創建AMapLocationClientOption對象

AMapLocationClientOption對象用來設置發起定位的模式和相關參數。

1 2 3 4 //聲明AMapLocationClientOption對象 public AMapLocationClientOption mLocationOption =null; //初始化AMapLocationClientOption對象 mLocationOption =new AMapLocationClientOption();

選擇定位模式

高德定位服務包含GPS和網絡定位(Wi-Fi和基站定位)兩種能力。定位SDK將GPS、網絡定位能力進行了封裝,以三種定位模式對外開放,SDK默認選擇使用高精度定位模式。

高精度定位模式:會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果,當通過GPS定位時不會返回地址描述信息。

1 2 //設置定位模式為AMapLocationMode.Hight_Accuracy,高精度模式。 mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);

低功耗定位模式:不會使用GPS和其他傳感器,只會使用網絡定位(Wi-Fi和基站定位);

1 2 //設置定位模式為AMapLocationMode.Battery_Saving,低功耗模式。 mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);

僅用設備定位模式:不需要連接網絡,只使用GPS進行定位,這種模式下不支持室內環境的定位,且不會返回地址描述信息。

1 2 //設置定位模式為AMapLocationMode.Device_Sensors,僅設備模式。 mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);

設置單次定位

如果您需要使用單次定位,需要進行如下設置:

1 2 3 4 5 6 7 8 9 //獲取一次定位結果: //該方法默認為false。 mLocationOption.setOnceLocation(true); //獲取最近3s內精度最高的一次定位結果: //設置setOnceLocationLatest(boolean b)接口為true,啟動定位時SDK會返回最近3s內精度最高的一次定位結果。如果設置其為true,setOnceLocation(boolean b)接口也會被設置為true,反之不會,默認為false。 mLocationOption.setOnceLocationLatest(true); }

自定義連續定位

SDK默認采用連續定位模式,時間間隔2000ms。如果您需要自定義調用間隔:

1 2 //設置定位間隔,單位毫秒,默認為2000ms,最低1000ms。 mLocationOption.setInterval(1000);

其他參數

設置定位同時是否需要返回地址描述。

1 2 //設置是否返回地址信息(默認返回地址信息) mLocationOption.setNeedAddress(true);

設置是否強制刷新WIFI,默認為強制刷新。每次定位主動刷新WIFI模塊會提升WIFI定位精度,但相應的會多付出一些電量消耗。

1 2 //設置是否強制刷新WIFI,默認為true,強制刷新。 mLocationOption.setWifiActiveScan(false);

設置是否允許模擬軟件Mock位置結果,多為模擬GPS定位結果,默認為false,不允許模擬位置。

1 2 //設置是否允許模擬位置,默認為false,不允許模擬位置 mLocationOption.setMockEnable(false);

啟動定位

1 2 3 4 //給定位客戶端對象設置定位參數 mLocationClient.setLocationOption(mLocationOption); //啟動定位 mLocationClient.startLocation();

第 4 步,獲取定位結果

AMapLocationListener接口只有onLocationChanged方法可以實現,用於接收異步返回的定位結果,回調參數是AMapLocation。

實現監聽器

1 2 3 4 5 6 7 8 //可以通過類implement方式實現AMapLocationListener接口,也可以通過創造接口類對象的方法實現 //以下為後者的舉例: AMapLocationListener mAMapLocationListener =new AMapLocationListener(){ @Override public void onLocationChanged(AMapLocation amapLocation) { } }

之後在監聽器的回調方法內解析AMapLocation對象。

解析AMapLocation對象

首先,可以判斷AMapLocation對象不為空,當定位錯誤碼類型為0時定位成功。

1 2 3 4 5 6 7 8 9 10 if (amapLocation !=null) { if (amapLocation.getErrorCode() ==0) { //可在其中解析amapLocation獲取相應內容。 }else { //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼表。 Log.e("AmapError","location Error, ErrCode:" + amapLocation.getErrorCode() +", errInfo:" + amapLocation.getErrorInfo()); } }

當定位成功時,可在如上判斷中解析amapLocation對象的具體字段,參考如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 amapLocation.getLocationType();//獲取當前定位結果來源,如網絡定位結果,詳見定位類型表 amapLocation.getLatitude();//獲取緯度 amapLocation.getLongitude();//獲取經度 amapLocation.getAccuracy();//獲取精度信息 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信息 //獲取定位時間 SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date =new Date(amapLocation.getTime()); df.format(date);

最後一步,停止定位

停止定位

1 mLocationClient.stopLocation();//停止定位後,本地定位服務並不會被銷毀

銷毀定位客戶端

銷毀定位客戶端之後,若要重新開啟定位請重新New一個AMapLocationClient對象。

1 mLocationClient.onDestroy();//銷毀定位客戶端,同時銷毀本地定位服務。

注意事項

● 目前手機設備在長時間黑屏或鎖屏時CPU會休眠,這導致定位SDK不能正常進行位置更新。若您有鎖屏狀態下獲取位置的需求,您可以應用alarmManager實現1個可叫醒CPU的Timer,定時請求定位。

● 使用定位SDK務必要注冊GPS和網絡的使用權限。

● 在使用定位SDK時,請盡量保證網絡暢通,如獲取網絡定位,地址信息等都需要設備可以正常接入網絡。

● 定位SDK在國內返回高德類型坐標,海外定位將返回GPS坐標。

● 僅設備定位(通過GPS定位)是設備本地定位行為,是不返回地址信息的,地址信息在網絡定位時會返回。

最後附上核心源代碼:

 

package gdtest.com.quan.car.mygdtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

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 java.text.SimpleDateFormat;
import java.util.Date;

/*
    權興權意-20160905
 */

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    //初始化定位
    //請在主線程中聲明AMapLocationClient類對象,需要傳Context類型的參數。
    // 推薦用getApplicationConext()方法獲取全進程有效的context。

    //聲明AMapLocationClient類對象
    public AMapLocationClient mLocationClient = null;
    //聲明定位回調監聽器
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            //獲取定位結果
            //AMapLocationListener接口只有onLocationChanged方法可以實現,用於接收異步返回的定位結果,回調參數是AMapLocation。
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //可在其中解析amapLocation獲取相應內容。
                    Log.d(TAG, "onLocationChanged: " + aMapLocation.getCountry() + aMapLocation.getProvince()
                    + aMapLocation.getCity() + aMapLocation.getDistrict() + aMapLocation.getStreet() + aMapLocation.getStreetNum());
                    Toast.makeText(getApplicationContext(),
                            "onLocationChanged: " + aMapLocation.getCountry() + aMapLocation.getProvince()
                                    + aMapLocation.getCity() + aMapLocation.getDistrict() + aMapLocation.getStreet() + aMapLocation.getStreetNum()
                            ,Toast.LENGTH_SHORT).show();
                    //獲取定位時間
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(aMapLocation.getTime());
                    Log.d(TAG, "onLocationChanged: " + df.format(date));
                    Toast.makeText(getApplicationContext(),"onLocationChanged: " + df.format(date),Toast.LENGTH_SHORT).show();
                }else {
                    //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼表。
                    Log.e("AmapError","location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    };

    //配置參數並啟動定位
    //聲明AMapLocationClientOption對象
    public AMapLocationClientOption mLocationOption = null;

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

        Toast.makeText(this,"onCreate",Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onCreate");

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

        //初始化AMapLocationClientOption對象
        mLocationOption = new AMapLocationClientOption();
        //高德定位服務包含GPS和網絡定位(Wi-Fi和基站定位)兩種能力。
        //定位SDK將GPS、網絡定位能力進行了封裝,以三種定位模式對外開放,SDK默認選擇使用高精度定位模式。
        //高精度定位模式:會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果,當通過GPS定位時不會返回地址描述信息。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        //自定義連續定位
        //SDK默認采用連續定位模式,時間間隔2000ms。如果您需要自定義調用間隔:
        //設置定位間隔,單位毫秒,默認為2000ms,最低1000ms。
        mLocationOption.setInterval(5000);

        //給定位客戶端對象設置定位參數
        mLocationClient.setLocationOption(mLocationOption);
        //啟動定位
        mLocationClient.startLocation();
    }

    @Override
    protected void onDestroy() {
        mLocationClient.stopLocation();//停止定位後,本地定位服務並不會被銷毀
        mLocationClient.onDestroy();//銷毀定位客戶端,同時銷毀本地定位服務。
        super.onDestroy();
    }
}

 

Android studio生成簽名包的時候 要求輸入 MasterPassword,結果忘了密碼。 可以通過reset操作重置密碼。
也可以進入 Appearance&Behavior ->SystemSetting->Passwords修改。


在cmd(命令提示符)下進行復制粘貼操作

右鍵命令提示符窗口的標題欄,選擇屬性。選擇“編輯選項”裡的“快速編輯模式”,並確定之;

 

復制:進行如上設置後,鼠標左鍵按下選定一個區域,再右鍵在窗口內單擊(或者按一下回車鍵),就將選定區文字復制下了。
粘貼:在未選定文字的狀態下,窗口內單擊右鍵,就將剪貼板的文字內容粘貼到窗口光標處了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved