百度地图定位城市
換了工作,以前東西整理的忘記帶了。沒辦法只能重新寫在上面。
首先進入百度地圖API網(wǎng)站地址?
登錄賬號并選擇Android開發(fā)地圖SDK進入創(chuàng)建應用界面?
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key
開發(fā)版的SHA1值,就是點擊Build,選擇Generate Signed APK...打包
在Terminal 輸入keytool -list -v -keystore 你自己的打包用到的keystore的路徑
然后簽名,密碼的話也就是你打包的輸入密碼
在里面就可以得到你想要的SHA1值
完成這一步了,然后呢
先從百度地圖開方平臺把包給下載下來
http://lbsyun.baidu.com/sdk/download
自己去選擇想要的
這是我自己的包名
build.gradle中配置SO的使用,如下所示:
sourceSets {
? ? ? ? main {
? ? jniLibs.srcDirs = ['libs']
? ? ? ? }
}
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
然后聲明權(quán)限
聲明使用權(quán)限
<!-- 這個權(quán)限用于進行網(wǎng)絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個權(quán)限用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于訪問wifi網(wǎng)絡信息,wifi信息會用于進行網(wǎng)絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運營商信息,用于支持提供運營商信息相關(guān)的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會用來進行網(wǎng)絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于讀取手機當前的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴展存儲,向擴展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網(wǎng)絡,網(wǎng)絡定位需要上網(wǎng)-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權(quán)限,用戶寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
設(shè)置AccessKey,在application標簽中加入
<meta-data
? ? ? ? ? ? android:name="com.baidu.lbsapi.API_KEY"
? ? ? ? ? ? android:value="key" /> ? ? ? //key:你自己百度申請的key
然后代碼中
第一步,初始化LocationClient類
此處需要注意:LocationClient類必須在主線程中聲明。需要Context類型的參數(shù)。
Context需要時全進程有效的context,推薦用getApplicationConext獲取全進程有效的context
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
?
public void onCreate() {
? ? mLocationClient = new LocationClient(getApplicationContext()); ? ? //聲明LocationClient類
? ? mLocationClient.registerLocationListener( myListener ); ? ?//注冊監(jiān)聽函數(shù)
}
第二步 LocationClientOption類,該類用來設(shè)置定位SDK的定位方式,e.g.:
private void initLocation(){
? ? ? ? LocationClientOption option = new LocationClientOption();
? ? ? ? option.setLocationMode(LocationMode.Hight_Accuracy
);//可選,默認高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備
? ? ? ? option.setCoorType("bd09ll");//可選,默認gcj02,設(shè)置返回的定位結(jié)果坐標系
? ? ? ? int span=1000;
? ? ? ? option.setScanSpan(span);//可選,默認0,即僅定位一次,設(shè)置發(fā)起定位請求的間隔需要大于等于1000ms才是有效的
? ? ? ? option.setIsNeedAddress(true);//可選,設(shè)置是否需要地址信息,默認不需要
? ? ? ? option.setOpenGps(true);//可選,默認false,設(shè)置是否使用gps
? ? ? ? option.setLocationNotify(true);//可選,默認false,設(shè)置是否當gps有效時按照1S1次頻率輸出GPS結(jié)果
? ? ? ? option.setIsNeedLocationDescribe(true);//可選,默認false,設(shè)置是否需要位置語義化結(jié)果,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近”
? ? ? ? option.setIsNeedLocationPoiList(true);//可選,默認false,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可選,默認true,定位SDK內(nèi)部是一個SERVICE,并放到了獨立進程,設(shè)置是否在stop的時候殺死這個進程,默認不殺死 ?
? ? ? ? option.SetIgnoreCacheException(false);//可選,默認false,設(shè)置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);//可選,默認false,設(shè)置是否需要過濾gps仿真結(jié)果,默認需要
? ? ? ? mLocationClient.setLocOption(option);
? ? }
高精度定位模式:這種定位模式下,會同時使用網(wǎng)絡定位和GPS定位,優(yōu)先返回最高精度的定位結(jié)果;
低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網(wǎng)絡定位(Wi-Fi和基站定位);
僅用設(shè)備定位模式:這種定位模式下,不需要連接網(wǎng)絡,只使用GPS進行定位,這種模式下不支持室內(nèi)環(huán)境的定位。
第三步,實現(xiàn)BDLocationListener接口
BDLocationListener接口有1個方法需要實現(xiàn): 1.接收異步返回的定位結(jié)果,參數(shù)是BDLocation類型參數(shù)。
public class MyLocationListener implements BDLocationListener {
?
? ? ? ? @Override
? ? ? ? public void onReceiveLocation(BDLocation location) {
? ? ? ? ? ? //Receive Location
? ? ? ? ? ? StringBuffer sb = new StringBuffer(256);
? ? ? ? ? ? sb.append("time : ");
? ? ? ? ? ? sb.append(location.getTime());
? ? ? ? ? ? sb.append("\nerror code : ");
? ? ? ? ? ? sb.append(location.getLocType());
? ? ? ? ? ? sb.append("\nlatitude : ");
? ? ? ? ? ? sb.append(location.getLatitude());
? ? ? ? ? ? sb.append("\nlontitude : ");
? ? ? ? ? ? sb.append(location.getLongitude());
? ? ? ? ? ? sb.append("\nradius : ");
? ? ? ? ? ? sb.append(location.getRadius());
? ? ? ? ? ? if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位結(jié)果
? ? ? ? ? ? ? ? sb.append("\nspeed : ");
? ? ? ? ? ? ? ? sb.append(location.getSpeed());// 單位:公里每小時
? ? ? ? ? ? ? ? sb.append("\nsatellite : ");
? ? ? ? ? ? ? ? sb.append(location.getSatelliteNumber());
? ? ? ? ? ? ? ? sb.append("\nheight : ");
? ? ? ? ? ? ? ? sb.append(location.getAltitude());// 單位:米
? ? ? ? ? ? ? ? sb.append("\ndirection : ");
? ? ? ? ? ? ? ? sb.append(location.getDirection());// 單位度
? ? ? ? ? ? ? ? sb.append("\naddr : ");
? ? ? ? ? ? ? ? sb.append(location.getAddrStr());
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("gps定位成功");
?
? ? ? ? ? ? } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 網(wǎng)絡定位結(jié)果
? ? ? ? ? ? ? ? sb.append("\naddr : ");
? ? ? ? ? ? ? ? sb.append(location.getAddrStr());
? ? ? ? ? ? ? ? //運營商信息
? ? ? ? ? ? ? ? sb.append("\noperationers : ");
? ? ? ? ? ? ? ? sb.append(location.getOperators());
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("網(wǎng)絡定位成功");
? ? ? ? ? ? } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結(jié)果
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("離線定位成功,離線定位結(jié)果也是有效的");
? ? ? ? ? ? } else if (location.getLocType() == BDLocation.TypeServerError) {
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("服務端網(wǎng)絡定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因");
? ? ? ? ? ? } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("網(wǎng)絡不同導致定位失敗,請檢查網(wǎng)絡是否通暢");
? ? ? ? ? ? } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
? ? ? ? ? ? ? ? sb.append("\ndescribe : ");
? ? ? ? ? ? ? ? sb.append("無法獲取有效定位依據(jù)導致定位失敗,一般是由于手機的原因,處于飛行模式下一般會造成這種結(jié)果,可以試著重啟手機");
? ? ? ? ? ? }
sb.append("\nlocationdescribe : ");
? ? ? ? ? ? ? ? sb.append(location.getLocationDescribe());// 位置語義化信息
? ? ? ? ? ? ? ? List<Poi> list = location.getPoiList();// POI數(shù)據(jù)
? ? ? ? ? ? ? ? if (list != null) {
? ? ? ? ? ? ? ? ? ? sb.append("\npoilist size = : ");
? ? ? ? ? ? ? ? ? ? sb.append(list.size());
? ? ? ? ? ? ? ? ? ? for (Poi p : list) {
? ? ? ? ? ? ? ? ? ? ? ? sb.append("\npoi= : ");
? ? ? ? ? ? ? ? ? ? ? ? sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? Log.i("BaiduLocationApiDem", sb.toString());
? ? ? ? }
第四步,開始定位
開啟:
mLocationClient.start();
位置提醒使用
位置提醒最多提醒3次,3次過后將不再提醒。 假如需要再次提醒,或者要修改提醒點坐標,都可通過函數(shù)SetNotifyLocation()來實現(xiàn)。
//位置提醒相關(guān)代碼
mNotifyer = new NotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4個參數(shù)代表要位置提醒的點的坐標,具體含義依次為:緯度,經(jīng)度,距離范圍,坐標系類型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注冊位置提醒監(jiān)聽事件后,可以通過SetNotifyLocation 來修改位置提醒設(shè)置,修改后立刻生效。
//BDNotifyListner實現(xiàn)
public class NotifyLister extends BDNotifyListener{
? ? ? ?public void onNotify(BDLocation mlocation, float distance){
? ? mVibrator01.vibrate(1000);//振動提醒已到設(shè)定位置附近
? ? ? ?}
? ? }
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);
這樣子是不是很簡單,
再給出獲取error code: 返回值:
61 : GPS定位結(jié)果,GPS定位成功。
62 : 無法獲取有效定位依據(jù),定位失敗,請檢查運營商網(wǎng)絡或者wifi網(wǎng)絡是否正常開啟,嘗試重新請求定位。
63 : 網(wǎng)絡異常,沒有成功向服務器發(fā)起請求,請確認當前測試手機網(wǎng)絡是否通暢,嘗試重新請求定位。
65 : 定位緩存的結(jié)果。
66 : 離線定位結(jié)果。通過requestOfflineLocaiton調(diào)用時對應的返回結(jié)果。
67 : 離線定位失敗。通過requestOfflineLocaiton調(diào)用時對應的返回結(jié)果。
68 : 網(wǎng)絡連接失敗時,查找本地離線定位時對應的返回結(jié)果。
161: 網(wǎng)絡定位結(jié)果,網(wǎng)絡定位定位成功。
162: 請求串密文解析失敗,一般是由于客戶端SO文件加載失敗造成,請嚴格參照開發(fā)指南或demo開發(fā),放入對應SO文件。
167: 服務端定位失敗,請您檢查是否禁用獲取位置信息權(quán)限,嘗試重新請求定位。
502: key參數(shù)錯誤,請按照說明文檔重新申請KEY。
505: key不存在或者非法,請按照說明文檔重新申請KEY。
601: key服務被開發(fā)者自己禁用,請按照說明文檔重新申請KEY。
602: key mcode不匹配,您的ak配置過程中安全碼設(shè)置有問題,請確保:sha1正確,“;”分號是英文狀態(tài);且包名是您當前運行應用的包名,請按照說明文檔重新申請KEY。
501~700:key驗證失敗,請按照說明文檔重新申請KEY。
總結(jié)
- 上一篇: 电脑usb卸载鼠标不能用了怎么办啊 电脑
- 下一篇: Android 6.0动态权限