百度地图实现定位功能
生活随笔
收集整理的這篇文章主要介紹了
百度地图实现定位功能
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
---恢復(fù)內(nèi)容開(kāi)始---
1.首先先申請(qǐng)一個(gè)百度地圖密鑰
網(wǎng)址:?http://lbsyun.baidu.com/apiconsole/key;
利用工具軟件獲取SHA1值或者在黑窗口獲取
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key
2.下載對(duì)應(yīng)的SDK并導(dǎo)入
http://lbsyun.baidu.com/sdk/download
3.環(huán)境配置
?
(1)在application中添加開(kāi)發(fā)密鑰
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開(kāi)發(fā)者 key" /> </application>2)添加所需權(quán)限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" />第三步,在布局xml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />4.在應(yīng)用程序創(chuàng)建時(shí)初始化 SDK引用的Context 全局變量: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實(shí)現(xiàn) SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
5,創(chuàng)建地圖Activity,管理地圖生命周期;
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實(shí)現(xiàn) SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理 mMapView.onPause(); } } --------------至此形成一個(gè)基礎(chǔ)地圖----------------定位開(kāi)始
6.首先要早builde grade中加入下列代碼來(lái)處理so文件
sourceSets {main {jniLibs.srcDirs = ['libs'] } } 在 Androidmainfiest中加入 <service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"> </service> 再補(bǔ)點(diǎn)權(quán)限 <!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 這個(gè)權(quán)限用于訪問(wèn)GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于訪問(wèn)wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 獲取運(yùn)營(yíng)商信息,用于支持提供運(yùn)營(yíng)商信息相關(guān)的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來(lái)進(jìn)行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用于讀取手機(jī)當(dāng)前的狀態(tài)--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 寫(xiě)入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫(xiě)入數(shù)據(jù),用于寫(xiě)入離線定位數(shù)據(jù)--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 訪問(wèn)網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡讀取權(quán)限,用戶寫(xiě)入離線定位數(shù)據(jù)--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
---------------------
重要步驟
初始化LocationClient類(lèi)
public LocationClient mLocationClient = null;public BDAbstractLocationListener myListener = new MyLocationListener(); public void onCreate() { mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類(lèi) mLocationClient.registerLocationListener( myListener ); //注冊(cè)監(jiān)聽(tīng)函數(shù) }LocationClientOption類(lèi),該類(lèi)用來(lái)設(shè)置定位SDK的定位方式,例如:
private void initLocation(){LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可選,默認(rèn)高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備
option.setCoorType("bd09ll");
//可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系
int span=1000;
option.setScanSpan(span);
//可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請(qǐng)求的間隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);
//可選,設(shè)置是否需要地址信息,默認(rèn)不需要
option.setOpenGps(true);
//可選,默認(rèn)false,設(shè)置是否使用gps
option.setLocationNotify(true);
//可選,默認(rèn)false,設(shè)置是否當(dāng)GPS有效時(shí)按照1S/1次頻率輸出GPS結(jié)果
option.setIsNeedLocationDescribe(true);
//可選,默認(rèn)false,設(shè)置是否需要位置語(yǔ)義化結(jié)果,可以在BDLocation.getLocationDescribe里得到,結(jié)果類(lèi)似于“在北京天安門(mén)附近”
option.setIsNeedLocationPoiList(true);
//可選,默認(rèn)false,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);
//可選,默認(rèn)true,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(rèn)不殺死
// option.setIgnoreCacheException(false);
//可選,默認(rèn)false,設(shè)置是否收集CRASH信息,默認(rèn)收集
option.setEnableSimulateGps(false);
//可選,默認(rèn)false,設(shè)置是否需要過(guò)濾GPS仿真結(jié)果,默認(rèn)需要
// option.setWifiValidTime(5*60*1000);
//可選,7.2版本新增能力,如果您設(shè)置了這個(gè)接口,首次啟動(dòng)定位時(shí),會(huì)先判斷當(dāng)前WiFi是否超出有效期,超出有效期的話,會(huì)先重新掃描WiFi,然后再定位
mLocationClient.setLocOption(option);
} private class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//獲取定位結(jié)果
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime()); //獲取定位時(shí)間
sb.append("\nerror code : ");
sb.append(location.getLocType()); //獲取類(lèi)型類(lèi)型
sb.append("\nlatitude : ");
sb.append(location.getLatitude()); //獲取緯度信息
sb.append("\nlontitude : ");
sb.append(location.getLongitude()); //獲取經(jīng)度信息
sb.append("\nradius : ");
sb.append(location.getRadius()); //獲取定位精準(zhǔn)度
if (location.getLocType() == BDLocation.TypeGpsLocation){
// GPS定位結(jié)果
sb.append("\nspeed : ");
sb.append(location.getSpeed()); // 單位:公里每小時(shí)
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber()); //獲取衛(wèi)星數(shù)
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)絡(luò)定位結(jié)果
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //獲取地址信息
sb.append("\noperationers : ");
sb.append(location.getOperators()); //獲取運(yùn)營(yíng)商信息
sb.append("\ndescribe : ");
sb.append("網(wǎng)絡(luò)定位成功");
} 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ù)端網(wǎng)絡(luò)定位失敗,可以反饋IMEI號(hào)和大體定位時(shí)間到loc-bugs@baidu.com,會(huì)有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("網(wǎng)絡(luò)不同導(dǎo)致定位失敗,請(qǐng)檢查網(wǎng)絡(luò)是否通暢");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("無(wú)法獲取有效定位依據(jù)導(dǎo)致定位失敗,一般是由于手機(jī)的原因,處于飛行模式下一般會(huì)造成這種結(jié)果,可以試著重啟手機(jī)");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe()); //位置語(yǔ)義化信息
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());
}
/**
* 回調(diào)定位診斷信息,開(kāi)發(fā)者可以根據(jù)相關(guān)信息解決定位遇到的一些問(wèn)題
* 自動(dòng)回調(diào),相同的diagnosticType只會(huì)回調(diào)一次
*
* @param locType 當(dāng)前定位類(lèi)型
* @param diagnosticType 診斷類(lèi)型(1~9)
* @param diagnosticMessage 具體的診斷信息釋義
*/
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_GPS) {
//建議打開(kāi)GPS
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_WIFI) {
//建議打開(kāi)wifi,不必連接,這樣有助于提高網(wǎng)絡(luò)定位精度!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_LOC_PERMISSION) {
//定位權(quán)限受限,建議提示用戶授予APP定位權(quán)限!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_NET) {
//網(wǎng)絡(luò)異常造成定位失敗,建議用戶確認(rèn)網(wǎng)絡(luò)狀態(tài)是否異常!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CLOSE_FLYMODE) {
//手機(jī)飛行模式造成定位失敗,建議用戶關(guān)閉飛行模式后再重試定位!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_INSERT_SIMCARD_OR_OPEN_WIFI) {
//無(wú)法獲取任何定位依據(jù),建議用戶打開(kāi)wifi或者插入sim卡重試!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_OPEN_PHONE_LOC_SWITCH) {
//無(wú)法獲取有效定位依據(jù),建議用戶打開(kāi)手機(jī)設(shè)置里的定位開(kāi)關(guān)后重試!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_SERVER_FAIL) {
//百度定位服務(wù)端定位失敗
//建議反饋location.getLocationID()和大體定位時(shí)間到loc-bugs@baidu.com
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_FAIL_UNKNOWN) {
//無(wú)法獲取有效定位依據(jù),但無(wú)法確定具體原因
//建議檢查是否有安全軟件屏蔽相關(guān)定位權(quán)限
//或調(diào)用重新啟動(dòng)后重試!
}
}
}
啟動(dòng)定位,代碼如下:
mLocationClient.start(); ??
ok---恢復(fù)內(nèi)容結(jié)束---
轉(zhuǎn)載于:https://www.cnblogs.com/xlgwzh/p/xlgwzh02.html
總結(jié)
以上是生活随笔為你收集整理的百度地图实现定位功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java注解(1)-注解基础
- 下一篇: java对象克隆