ndfweb.cn

[轉]Android通過百度地圖API用Service和Alarm在後台定時獲取地理位置信息


2021-04-30 14:25:29 (3756)



本文主要介紹了Android項目集成百度地圖API,使用AlarmManager定時調用Service,在Service中請求坐標更新,並通過坐標得到省、市和縣三級地理位置信息的方法。

程序結構很簡單,先做簡單介紹,後麵詳細說明:

  1. MainActivity.java是創建項目自帶的,不用管;

  2. BMapApiDemoApp.java是大部分是百度自帶demo文件沒有改動,隻是在裏麵添加了Alarm相關的代碼;

  3. GetLocationService.java是Alarm啟動的Service類,在這個類中請求位置更新;

  4. GeoCoderParser.java是用於接收地理位置信息的回調類。

百度地圖API

集成百度地圖API的方式很簡單,可以上官網http://developer.baidu.com/map/sdk-android.htm下載相應的庫文件和demo。具體的集成方法這裏不再贅述,僅僅討論一下BMapApiDemoApp這個類。代碼如下:

View Code

主要關注如下幾點:

  1. BMapApiDemoApp覆蓋了Application類,並在onCreate()函數中初始化BMapManager對象,這樣程序就可以共享這個對象。

  2. BMapManager類主要有4個函數,init(), start(), stop() 和destory()。一般在Application類的onCreate()函數中調用init,在onDestory()函數中調用destory,這樣在需要使用其他API的地方隻需要取到這個對象並調用start和stop方法就可以了。但是為了保證BMapManager對象存在,在其他調用的類中還是會做相應的檢查。

  3. 文件中變量mStrKey保存的是需要去官網申請的API的key,申請很容易。

  4. 我在onCreate()函數中還調用了startAlarm()函數。這個函數的作用是每隔10s調用GetLocationService類。

GetLocationService

GetLocationService主要覆寫了兩個函數onStartCommand()和onCreate(),代碼如下:

View Code

其中:

  1. 在onCreate()中取到在BMapApiDemoApp裏定義的BMapManager對象,並檢查是否存在,不存在就初始化一個;

  2. 在onStartCommand()中注冊LocationListener並調用BMapManager的start函數;

  3. LocationListener是在onCreate()中定義的,mMKSearch.reverseGeocode()傳入GeoPoint對象,搜索之後的返回值通過GeoCoderParser類取到;當得到Location信息之後我調用了removeUpdates和stop函數停止請求更新。

1 GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));2 mMKSearch.reverseGeocode(point);3                     4 app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);5 app.mBMapMan.stop();

代碼最後執行的時候有一個小bug就是removeUpdate()貌似被執行了兩次,沒有詳細追究,不知道是什麼原因。不過也無傷大雅。

GeoCoderParser

最後就是用於接收MKSearch.reverseGeocode()結果的類。

這個類的實現了MKSearchListener接口,接口的函數比較多,但是我們這裏隻關注onGetAddrResult(MKAddrInfo arg0, int arg1)函數。這個函數有兩個參數:

  1. arg1是錯誤碼,搜索失敗的時候通過錯誤碼得到失敗原因;

  2. arg0是傳入的地址信息,它是一個MKAddrInfo對象,對象有個字段是addressComponents,這個字段保存了從省、市一直到門牌號的信息。

複製代碼

 1 public class GeoCoderParser implements MKSearchListener { 2  3     private static final String TAG = "GeoCoderParser"; 4  5     @Override 6     public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 7         if (arg1 != 0) { 8             String str = String.format("%d", arg1); 9             Log.d(TAG, str);10             return;11         }12         MKGeocoderAddressComponent address = arg0.addressComponents;13         Log.d(TAG, "Location info:" + address.province + address.city + address.district);14     }15 16     //other functions17 18 }

複製代碼

項目代碼沒什麼特殊的地方,主要注意一下Manifest文件裏麵請求相應的權限和注冊Service就行了。


本文版权:http://www.ndfweb.cn/news-841.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2025 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅