編輯:關於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 值,如下圖所示:
通過Android Studio編譯器獲取SHA1
第一步、打開Android Studio的Terminal工具
第二步、輸入命令:keytool -v -list -keystore keystore文件路徑
第三步、輸入Keystore密碼
使用 keytool(jdk自帶工具)獲取SHA1
1.運行進入控制台。
2.在彈出的控制台窗口中輸入 cd .android 定位到 .android 文件夾。(我的路徑為:C:\Users\car\.android\debug.keystore,僅供參考;最好的方法是全局搜索)
3.繼續在控制台輸入命令。
debug.keystore:命令為:keytool -list -v -keystore debug.keystore
自定義的 keystore:命令為:keytool -list -v -keystore apk的keystore
如下所示:
提示輸入密鑰庫密碼,編譯器提供的debug keystore默認密碼是 android,自定義簽名文件的密碼請自行填寫。輸入密鑰後回車(如果沒設置密碼,可直接回車),此時可在控制台顯示的信息中獲取 SHA1 值,如下圖所示:
說明:keystore 文件為 Android 簽名證書文件。
Android Studio 配置工程 1、新建一個 Empty Activity 的應用項目,您可參考入門指南<創建工程>章節創建一個 Android 工程。
2、將下載的定位SDK的jar包復制到libs目錄下,如果有老版本定位jar包在其中,請刪除。如圖所示:
為了保證高德 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(命令提示符)下進行復制粘貼操作
右鍵命令提示符窗口的標題欄,選擇屬性。選擇“編輯選項”裡的“快速編輯模式”,並確定之;
復制:進行如上設置後,鼠標左鍵按下選定一個區域,再右鍵在窗口內單擊(或者按一下回車鍵),就將選定區文字復制下了。
粘貼:在未選定文字的狀態下,窗口內單擊右鍵,就將剪貼板的文字內容粘貼到窗口光標處了。
有過一些面試經驗的人基本都深有體會,每次面試一般都會問到Fragment的知識,所以,今天我就單獨把Fragment拿出來與大家分享一下. 會涉及到Fragment如
打開谷歌api,對widget小部件做如下說明:App Widgets are miniature application views that can be embed
IntentService一、IntentService概述??上一篇我們聊到了HandlerThread,本篇我們就來看看HandlerThread在IntentSer
在之前已經介紹了一篇關於如何編寫簡單的驅動以及訪問該驅動的小程序,最後將程序編譯到Android內核源碼中通過程序訪問驅動驗證是可以通過的,那麼本文就繼續這個知識點,把這