Android 位置服务——BaiduLocation的使用
版權(quán)聲明:本文為博主原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)?jiān)谖恼嘛@眼處說(shuō)明文章出處并給出連接。 https://blog.csdn.net/To_be_Designer/article/details/48685475
這一節(jié)我們使用Baidu的定位服務(wù),我們同樣要向上一篇博客一樣下載Baidu定位的SDK。因?yàn)樵凇禔ndroid 位置服務(wù)——BaiduMap的使用 》這篇博客中我們已經(jīng)講過(guò)下載步驟,這里我們不在重復(fù)講解下載的過(guò)程,不明白的可以直接去上一篇博客中學(xué)習(xí)。
這一節(jié)的講解是以上一節(jié)中百度地圖為基礎(chǔ)的,使用的是上一節(jié)的項(xiàng)目工程。建議大家先看一下《Android 位置服務(wù)——BaiduMap的使用 》。
其實(shí)這里的步驟和Baidu定位中提供的文檔是差不多的,此處整理的目的只為加深樓主的印象。
Baidu定位環(huán)境配置
1. 首先將jar包拷貝到libs文件夾下。
2. 通過(guò)Android Studio “File——>Project Structure——>Dependencies”中的File Dependency將我們剛才拷貝的.jar包導(dǎo)入。
3. 其次在main文件夾下創(chuàng)建一個(gè)“jniLibs”的文件夾,將包含.so文件的文件夾復(fù)制到此處。
4. 配置AndroidManifext.xml.
- 在application標(biāo)簽中聲明service組件,每個(gè)app擁有自己?jiǎn)为?dú)的定位service
- 設(shè)置AcessKey
- 聲明權(quán)限
Baidu定位使用
再次聲明下這里使用的項(xiàng)目是基于《Android 位置服務(wù)——BaiduMap的使用 》這篇博客的,在此基礎(chǔ)上進(jìn)行定位功能呢的添加。
1.初始化LocationClient類(lèi)。
public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener();public void onCreate() {mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類(lèi)mLocationClient.registerLocationListener( myListener ); //注冊(cè)監(jiān)聽(tīng)函數(shù)//以上兩句卸載setContentView(R.layout.activity_main)之前。 }2. 配置定位SDK參數(shù)。
private void initLocation(){LocationClientOption option = new LocationClientOption();option.setLocationMode(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è)置是否使用gpsoption.setLocationNotify(true);//可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時(shí)按照1S1次頻率輸出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)false,定位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)需要mLocationClient.setLocOption(option);}高精度定位模式:這種定位模式下,會(huì)同時(shí)使用網(wǎng)絡(luò)定位和GPS定位,優(yōu)先返回最高精度的定位結(jié)果;
低功耗定位模式:這種定位模式下,不會(huì)使用GPS,只會(huì)使用網(wǎng)絡(luò)定位(Wi-Fi和基站定位);
僅用設(shè)備定位模式:這種定位模式下,不需要連接網(wǎng)絡(luò),只使用GPS進(jìn)行定位,這種模式下不支持室內(nèi)環(huán)境的定位。
3. 實(shí)現(xiàn)BDLocationListener接口,在艦艇中對(duì)定位進(jìn)行處理。這里我們做的處理是在定位處方放置定位符號(hào),并添加連線。
@Overridepublic void onReceiveLocation(BDLocation location) {if (location.getLocType() == BDLocation.TypeServerError) {} else if (location.getLocType() == BDLocation.TypeNetWorkException) {} else if (location.getLocType() == BDLocation.TypeCriteriaException) {} else {mTextViewLocation.setText(location.getAddress().address);currentLongtitude = location.getLongitude();currentLatitude = location.getLatitude();mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));LatLng p = new LatLng(currentLatitude, currentLongtitude);points.add(p);}}}結(jié)果如下:
全部代碼如下:
public class MainActivity extends Activity implements View.OnClickListener {private Button mButtonStart;//開(kāi)始定位按鈕private Button mButtonOne;//獲取地址一按鈕private Button mButtonTwo;//獲取地址二按鈕private Button mButtonLine;//劃線按鈕private TextView mTextViewLocation;//顯示當(dāng)前的地址MapView mMapView = null;//地圖視圖BaiduMap mBaiduMap;//地圖對(duì)象//連線點(diǎn)的集合private List<LatLng> points = new ArrayList<LatLng>();//通過(guò)地址獲得經(jīng)緯度GeoCoder mSearch = null; // 搜索模塊,也可去掉地圖模塊獨(dú)立使用public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//定位mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類(lèi)mLocationClient.registerLocationListener(myListener); //注冊(cè)監(jiān)聽(tīng)函數(shù)//使用BaiduMap SDK//在使用SDK各組件之前初始化context信息,傳入ApplicationContextSDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);//獲取地圖控件引用mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對(duì)象mBaiduMap = mMapView.getMap();//獲得地圖對(duì)象//初始化搜索模塊,注冊(cè)事件監(jiān)聽(tīng)mSearch = GeoCoder.newInstance();//獲得搜索的對(duì)象mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未能找到結(jié)果", Toast.LENGTH_LONG).show();return;}mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));LatLng p = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);//添加點(diǎn)points.add(p);String strInfo = String.format("緯度:%f 經(jīng)度:%f",geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);Log.d("data", strInfo);Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {}});//獲取布局中的各個(gè)控件對(duì)象mButtonStart = (Button) findViewById(R.id.button_start);mButtonOne = (Button) findViewById(R.id.button_one);mButtonTwo = (Button) findViewById(R.id.button_two);mButtonLine = (Button) findViewById(R.id.button_three);mTextViewLocation = (TextView) findViewById(R.id.textview_location);//設(shè)置點(diǎn)擊事件mButtonStart.setOnClickListener(this);mButtonOne.setOnClickListener(this);mButtonTwo.setOnClickListener(this);mButtonLine.setOnClickListener(this);PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "5CjXwt6IZgRSfYxwA8dtOuG5");}/*Activity關(guān)閉時(shí)將地圖關(guān)閉*/@Overrideprotected void onDestroy() {super.onDestroy();//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理mMapView.onDestroy();}/*ActivityonResume時(shí),將地圖onResume。*/@Overrideprotected void onResume() {super.onResume();//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理mMapView.onResume();}/*ActivityonPause時(shí),將地圖onPause。*/@Overrideprotected void onPause() {super.onPause();//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理mMapView.onPause();}/*初始化定位*/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è)置是否使用gpsoption.setLocationNotify(true);//可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時(shí)按照1S1次頻率輸出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)false,定位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)需要mLocationClient.setLocOption(option);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button_start:initLocation();mLocationClient.start();//開(kāi)始定位break;case R.id.button_one://獲得天安門(mén)的地址mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀區(qū)中關(guān)村海龍大廈"));break;case R.id.button_two://獲得中關(guān)村的地址mSearch.geocode(new GeoCodeOption().city("北京市").address("西城區(qū)西便門(mén)"));break;case R.id.button_three://獲得當(dāng)?shù)氐牡刂?/span>// 添加折線OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);mBaiduMap.addOverlay(ooPolyline);break;}}//獲得當(dāng)前的經(jīng)緯度private double currentLongtitude;private double currentLatitude;class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location.getLocType() == BDLocation.TypeServerError) {} else if (location.getLocType() == BDLocation.TypeNetWorkException) {} else if (location.getLocType() == BDLocation.TypeCriteriaException) {} else {mTextViewLocation.setText(location.getAddress().address);currentLongtitude = location.getLongitude();currentLatitude = location.getLatitude();mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));LatLng p = new LatLng(currentLatitude, currentLongtitude);points.add(p);}}} } posted on 2018-09-21 16:54 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/9687386.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Android 位置服务——BaiduLocation的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dojo省份地市级联之省份Dao实现类(
- 下一篇: 【微信小程序】性能分析Trace工具