安卓中實現定位功能

  你們好,今天咱們講一下比較熱門的定位服務,閒話少敘直奔主題。由於是使用高德地圖因此首先我們就得先在高德開發平臺上註冊一個帳號,具體註冊流程在這裏就不一一贅訴了,下面就講一下再註冊成功以後如何申請key,要申請key就得須要發佈版NAS1碼與測試版NAS1碼以及工程的包地址,下面就講一下如何獲取NAS1碼。java

第一步:申請NAS1
 
     一、如果想得到發佈版的NAS1碼,就得先把你的工程打包,打包成功後你就會得到一個以.jsk爲後綴名的文件,打包的時候你會設置一個密碼,一會用到這個文件的儲存路徑以及你設置的密碼。
 
    二、打開你的androidstudio選擇你的工程,在控制檯選擇Terminal目錄下,在光標顯示的地方輸入 keytool -v -list -KeyStore KeyStore文件地址 這段代碼 ,KeyStore文件地址就是你的.jsk文件的地址,輸入完後按回車會讓你輸入密碼你直接輸入,注意你輸入密碼的時候控制檯並不顯示,但沒關係控制檯已經錄入,而後按回車就會出現一系列的信息其中就包括NAS1碼,這個就是發佈版的NAS1碼。
 
    三、如何得到測試版的NAS1碼,這裏就須要本身寫一個工具類來把測試版的NAS1打印出來,具體工具類代碼以下:
 1 import android.content.Context;
 2 import android.content.pm.PackageInfo;
 3 import android.content.pm.PackageManager;
 4 
 5 import java.security.MessageDigest;
 6 import java.security.NoSuchAlgorithmException;
 7 import java.util.Locale;
 8 
 9 /**
10  * Created by zhangdi on 2016/9/2.
11  * 用來獲取測試版SHA1的工具類
12  */
13 public class Sha1 {
14     public static String sHA1(Context context) {
15         try {
16             PackageInfo info = context.getPackageManager().getPackageInfo(
17                     context.getPackageName(), PackageManager.GET_SIGNATURES);
18             byte[] cert = info.signatures[0].toByteArray();
19             MessageDigest md = MessageDigest.getInstance("SHA1");
20             byte[] publicKey = md.digest(cert);
21             StringBuffer hexString = new StringBuffer();
22             for (int i = 0; i < publicKey.length; i++) {
23                 String appendString = Integer.toHexString(0xFF & publicKey[i])
24                         .toUpperCase(Locale.US);
25                 if (appendString.length() == 1)
26                     hexString.append("0");
27                 hexString.append(appendString);
28                 hexString.append(":");
29             }
30             String result = hexString.toString();
31             return result.substring(0, result.length()-1);
32         } catch (PackageManager.NameNotFoundException e) {
33             e.printStackTrace();
34         } catch (NoSuchAlgorithmException e) {
35             e.printStackTrace();
36         }
37         return null;
38     }
39 }

得到NAS1碼就直接類名.方法名就能夠打印出來。至此第一步得到NAS1碼的工序就完成了,下面就能夠去高德開發平臺上申請key了,注意他還須要一個包名,即pagename,這就是你工程中的清單文件下的android

 1 package="com.jereh.biyingapplication" api

而後就完成申請key的步驟了。
 
第二步:導入jar包(jar包我只提供了包名,你們能夠去GitHub上自行下載,若是你們感受麻煩能夠去個人有道筆記裏下載,文末我會附上此篇文章的有道連接)
 
     一、首先須要下載這個jar包
  AMap_Location_V2.8.0_20160811.jar
之後若是再要開發2D地圖還須要導入這個Jar包
  AMap_2DMap_V2.9.0_20160525.jar
導入包並添加依賴成功後就能夠進入正題,定位服務了!!!
 
第三步:實現定位功能
    一、由於定位功能須要獲取APP的位置信息,因此安卓6.0版本之上的還須要獲取權限,關於如何獲取權限,你們能夠參考個人判斷權限以及獲取權限的那篇文章,這裏就不贅述了
    二、一樣由於權限問題,你們還須要在工程的清單文件裏添加下面這些請求:
 1 <!-- Normal Permissions 不須要運行時註冊 -->
 2 <!-- 獲取運營商信息,用於支持提供運營商信息相關的接口 -->
 3 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 4 <!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位 -->
 5 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 6 <!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位 -->
 7 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 8 <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
 9 
10 <!-- 請求網絡 -->
11 <uses-permission android:name="android.permission.INTERNET" />
12 
13 <!-- 不是SDK須要的權限,是示例中的後臺喚醒定位須要的權限 -->
14 <uses-permission android:name="android.permission.WAKE_LOCK" />
15 
16 <!-- 須要運行時註冊的權限 -->
17 <!-- 用於進行網絡定位 -->
18 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
19 <!-- 用於訪問GPS定位 -->
20 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
21 
22 <!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入緩存定位數據 -->
23 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
24 <!-- 讀取緩存數據 -->
25 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
26 
27 <!-- 用於讀取手機當前的狀態 -->
28 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
29 
30 <!-- 更改設置 -->
31 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
32 
33 <!-- 外部存儲的權限 -->
34 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
35 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
36 <uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />

這個也不是都用於請求位置信息權限,你們用到什麼能夠選擇性的添加,由於定位是一個服務(service)因此再往下就是要爲這個service在清單文件裏聲明一下,以下代碼,直接copy:緩存

<!-- 定位服務 -->
<service android:name="com.amap.api.location.APSService" />

<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="6cd0117ba5d8e074a98ba70906f3efe2">

    <!-- 開發者申請的key -->
</meta-data>
這裏須要注意的是value裏填寫的值是你從高德開發平臺上申請的key值,作好這一切以後就能夠進入正題,在你的APP中實現定位服務功能了。
    三、java中設置定位服務的代碼:(我這裏都是封裝的方法,你們能夠自行斟酌)
        第一步:設置定位模式:
 1 /**
 2  * 設置定位模式
 3  */
 4 private void setLocationClient(){
 5     //定位模式,高精度定位,僅設備,網絡
 6     clientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
 7     //是否單次定位
 8     clientOption.setOnceLocation(false);
 9     //是否返回逆地理地理數據
10     clientOption.setNeedAddress(true);
11     //定位時間間隔
12     clientOption.setInterval(60000);
13     //定位超時時長
14     clientOption.setHttpTimeOut(30000);
15 }

    第二步:設置定位屬性:網絡

 1 /**
 2  * 設置定位屬性
 3  */
 4 private void locationCity(){
 5     //設置定位屬性
 6     setLocationClient();
 7     locationClient.setLocationOption(clientOption);
 8     locationClient.startLocation();
 9     locationClient.setLocationListener(this);
10 }

   第三步定位回調:app

 1 /**
 2  * 定位回調
 3  * @param aMapLocation
 4  */
 5 @Override
 6 public void onLocationChanged(AMapLocation aMapLocation) {
 7     //定位回調
 8     if (aMapLocation!=null&&aMapLocation.getErrorCode()==0){
 9         Log.i("定位回調",aMapLocation.getCity().toString());
10     }
11     if (aMapLocation.getErrorCode()!=0){
12         Log.i("定位回調","錯位信息"+aMapLocation.getErrorCode());
13         Log.i("定位回調","錯位信息"+aMapLocation.getErrorInfo());
14     }
15 }

其中log出來的就是定位服務的信息,定位成功與定位失敗都會在控制檯輸出,至此使用高德地圖實現定位服務的工做就完成了,感受仍是很簡單明瞭的,但願能給你們在定位方面的學習有所幫助,若是你們閱讀以後感受對您的理解有所幫助的話就請推薦一下,謝謝。ide

有道筆記連接: http://note.youdao.com/noteshare?id=afe19f09d5c431bdd8e09b28781cb0e0工具

相關文章
相關標籤/搜索