百度地圖:
emmm 首先聲明 這個代碼是有問題的。。。而且我最後都沒有找到問題出在哪 很奇怪怪 找了很久不斷有新的問題出現 也不斷髮現網上有新的說法。。。感情我成了百度鍊金石(?)
其次 功能都實現了 就是定位上一直出現偏差。。。較大偏差 文末會附上圖
接下來我就簡單說一下項目流程吧
配置環境和權限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mybaidulcoate">
<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<!-- 這個權限用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個權限用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網絡,網絡定位需要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權限,用戶寫入離線定位數據-->
隨後就是java中的各種類的編寫,這裏不一一列舉了
我還是大概說一下流程:
首先要有一個類來使用監聽函數
然後還要一個類來定位SDK的參數(emmm 也是這裏問題最多了 不懂着實不懂 要是有想知道的 可以去看看這個視頻肖老師騰訊課堂)
最後,咱們再整個接口類,把需要的什麼時間布拉布拉一股腦放進去 就OK了
放一點代碼吧
這是配置SDK的,能整出來靠的不是我。。。是同學情。。。
//配置定位SDK參數
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
option.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果座標系
int span = 1000;
option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大於等於1000ms纔是有效的
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setOpenGps(true);//可選,默認false,設置是否使用gps
option.setLocationNotify(true);//可選,默認false,設置是否當GPS有效時按照1S/1次頻率輸出GPS結果
option.setIsNeedLocationDescribe(true);//可選,默認false,設置是否需要位置語義化結果,可以在BDLocation
// .getLocationDescribe裏得到,結果類似於“在北京天安門附近”
option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裏得到
option.setIgnoreKillProcess(false);
option.setOpenGps(true); // 打開gps
//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死
option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);//可選,默認false,設置是否需要過濾GPS仿真結果,默認需要
mLocationClient.setLocOption(option);
}
//實現BDLocationListener接口,BDLocationListener爲結果監聽接口,異步獲取定位結果
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
latLng = new LatLng(location.getLatitude(),location.getLongitude());
// 構造定位數據
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 設置定位數據
mBaiduMap.setMyLocationData(locData);
// 當不需要定位圖層時關閉定位圖層
//mBaiduMap.setMyLocationEnabled(false);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// GPS定位結果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 網絡定位結果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 離線定位結果
Toast.makeText(MainActivity.this, location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeServerError) {
Toast.makeText(MainActivity.this, "服務器錯誤,請檢查", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
Toast.makeText(MainActivity.this, "網絡錯誤,請檢查", Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
Toast.makeText(MainActivity.this, "手機模式錯誤,請檢查是否飛行", Toast.LENGTH_SHORT).show();
}
}
}
}
然後叨叨一下遇到的問題吧
最開始我以爲是我的虛擬機配置問題
可能部分人也會真的是這麼一個問題
如果真的是的話 大家可以在創建SDK的時候在這裏瞅瞅
因爲時間太久遠了,我也忘記具體的了。很早之前我在另一個項目中遇到過因爲定位開啓一直報錯 找過來關掉了
隨後我又以爲是SDK的問題。。。
不必多說 重裝SDK
然而
還是報錯。。。
我循着報錯找到了這個。。。
我。。。太難了
最後是什麼問題咱也不知道 咱也不敢問
運行是沒有任何問題 但是
它會這麼提示我,機智的小夥伴會看到小面說飛行模式的問題 這裏統一說明 我必然是開了手機的定位功能的
我看了看定位位置
行吧。。。,我是一個海王。。。
溜了溜了
最後附上源碼源碼