安卓中實作定位功能
大家好,今天我們講一下比較熱門的定位服務,閑話少叙直奔主題。因為是使用高德地圖是以首先咱們就得先在高德開發平台上注冊一個賬号,具體注冊流程在這裡就不一一贅訴了,下面就講一下再注冊成功之後如何申請key,要申請key就得需要釋出版NAS1碼與測試版NAS1碼以及工程的包位址,下面就講一下如何擷取NAS1碼。
第一步:申請NAS1 1、若是想獲得釋出版的NAS1碼,就得先把你的工程打包,打包成功後你就會獲得一個以.jsk為字尾名的檔案,打包的時候你會設定一個密碼,一會用到這個檔案的儲存路徑以及你設定的密碼。 2、打開你的androidstudio選擇你的工程,在控制台選擇Terminal目錄下,在光标顯示的地方輸入 keytool -v -list -KeyStore KeyStore檔案位址 這段代碼 ,KeyStore檔案位址就是你的.jsk檔案的位址,輸入完後按回車會讓你輸入密碼你直接輸入,注意你輸入密碼的時候控制台并不顯示,但不要緊控制台已經錄入,然後按回車就會出現一系列的資訊其中就包括NAS1碼,這個就是釋出版的NAS1碼。 3、如何獲得測試版的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,這就是你工程中的清單檔案下的
1 package="com.jereh.biyingapplication"
然後就完成申請key的步驟了。 第二步:導入jar包(jar包我隻提供了包名,大家可以去GitHub上自行下載下傳,如果大家感覺麻煩可以去我的有道筆記裡下載下傳,文末我會附上此篇文章的有道連結) 1、首先需要下載下傳這個jar包 AMap_Location_V2.8.0_20160811.jar 以後如果再要開發2D地圖還需要導入這個Jar包 AMap_2DMap_V2.9.0_20160525.jar 導入包并添加依賴成功後就可以進入正題,定位服務了!!! 第三步:實作定位功能 1、因為定位功能需要擷取APP的位置資訊,是以安卓6.0版本之上的還需要擷取權限,關于如何擷取權限,大家可以參考我的判斷權限以及擷取權限的那篇文章,這裡就不贅述了 2、同樣因為權限問題,大家還需要在工程的清單檔案裡添加下面這些請求:
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中實作定位服務功能了。 3、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 }
第三步定位回調:
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出來的就是定位服務的資訊,定位成功與定位失敗都會在控制台輸出,至此使用高德地圖實作定位服務的工作就完成了,感覺還是很簡單明了的,希望能給大家在定位方面的學習有所幫助,如果大家閱讀之後感覺對您的了解有所幫助的話就請推薦一下,謝謝。
有道筆記連結: http://note.youdao.com/noteshare?id=afe19f09d5c431bdd8e09b28781cb0e0
posted on 2016-09-03 17:20 < /> 閱讀( ...) 評論( ...) 編輯 收藏
轉載于:https://www.cnblogs.com/zhangdiIT/p/5837584.html