百度地图实现定位功能
生活随笔
收集整理的這篇文章主要介紹了
百度地图实现定位功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
---恢復內容開始---
1.首先先申請一個百度地圖密鑰
網址:?http://lbsyun.baidu.com/apiconsole/key;
利用工具軟件獲取SHA1值或者在黑窗口獲取
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key
2.下載對應的SDK并導入
http://lbsyun.baidu.com/sdk/download
3.環境配置
?
(1)在application中添加開發密鑰
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發者 key" /> </application>2)添加所需權限
<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.在應用程序創建時初始化 SDK引用的Context 全局變量: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
5,創建地圖Activity,管理地圖生命周期;
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理 mMapView.onPause(); } } --------------至此形成一個基礎地圖----------------定位開始
6.首先要早builde grade中加入下列代碼來處理so文件
sourceSets {main {jniLibs.srcDirs = ['libs'] } } 在 Androidmainfiest中加入 <service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"> </service> 再補點權限 <!-- 這個權限用于進行網絡定位--> <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卡讀取權限,用戶寫入離線定位數據--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
---------------------
重要步驟
初始化LocationClient類
public LocationClient mLocationClient = null;public BDAbstractLocationListener myListener = new MyLocationListener(); public void onCreate() { mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類 mLocationClient.registerLocationListener( myListener ); //注冊監聽函數 }LocationClientOption類,該類用來設置定位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);
//可選,默認true,定位SDK內部是一個SERVICE,并放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死
// option.setIgnoreCacheException(false);
//可選,默認false,設置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);
//可選,默認false,設置是否需要過濾GPS仿真結果,默認需要
// option.setWifiValidTime(5*60*1000);
//可選,7.2版本新增能力,如果您設置了這個接口,首次啟動定位時,會先判斷當前WiFi是否超出有效期,超出有效期的話,會先重新掃描WiFi,然后再定位
mLocationClient.setLocOption(option);
} private class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation 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定位結果
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){
// 網絡定位結果
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //獲取地址信息
sb.append("\noperationers : ");
sb.append(location.getOperators()); //獲取運營商信息
sb.append("\ndescribe : ");
sb.append("網絡定位成功");
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 離線定位結果
sb.append("\ndescribe : ");
sb.append("離線定位成功,離線定位結果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服務端網絡定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("網絡不同導致定位失敗,請檢查網絡是否通暢");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("無法獲取有效定位依據導致定位失敗,一般是由于手機的原因,處于飛行模式下一般會造成這種結果,可以試著重啟手機");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe()); //位置語義化信息
List<Poi> list = location.getPoiList(); // POI數據
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());
}
/**
* 回調定位診斷信息,開發者可以根據相關信息解決定位遇到的一些問題
* 自動回調,相同的diagnosticType只會回調一次
*
* @param locType 當前定位類型
* @param diagnosticType 診斷類型(1~9)
* @param diagnosticMessage 具體的診斷信息釋義
*/
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_GPS) {
//建議打開GPS
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_WIFI) {
//建議打開wifi,不必連接,這樣有助于提高網絡定位精度!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_LOC_PERMISSION) {
//定位權限受限,建議提示用戶授予APP定位權限!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_NET) {
//網絡異常造成定位失敗,建議用戶確認網絡狀態是否異常!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CLOSE_FLYMODE) {
//手機飛行模式造成定位失敗,建議用戶關閉飛行模式后再重試定位!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_INSERT_SIMCARD_OR_OPEN_WIFI) {
//無法獲取任何定位依據,建議用戶打開wifi或者插入sim卡重試!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_OPEN_PHONE_LOC_SWITCH) {
//無法獲取有效定位依據,建議用戶打開手機設置里的定位開關后重試!
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_SERVER_FAIL) {
//百度定位服務端定位失敗
//建議反饋location.getLocationID()和大體定位時間到loc-bugs@baidu.com
} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_FAIL_UNKNOWN) {
//無法獲取有效定位依據,但無法確定具體原因
//建議檢查是否有安全軟件屏蔽相關定位權限
//或調用重新啟動后重試!
}
}
}
啟動定位,代碼如下:
mLocationClient.start(); ??
ok---恢復內容結束---
轉載于:https://www.cnblogs.com/xlgwzh/p/xlgwzh02.html
總結
以上是生活随笔為你收集整理的百度地图实现定位功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java注解(1)-注解基础
- 下一篇: java对象克隆