日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

百度地图实现定位功能

發(fā)布時(shí)間:2024/1/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 百度地图实现定位功能 小編覺(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。