Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)
現(xiàn)在有這么一個(gè)需求:開(kāi)啟一個(gè)Service服務(wù),獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù),將獲取的數(shù)據(jù)以廣播的方式發(fā)送出去,注冊(cè)廣播的Activity接收廣播信息,并將接收到的數(shù)據(jù)在當(dāng)前Activity顯示,如果當(dāng)前位置發(fā)生變化,經(jīng)緯度數(shù)據(jù)改變,獲取改變后的經(jīng)緯度數(shù)據(jù),通過(guò)Handler發(fā)送消息,更新UI界面,顯示更新后的內(nèi)容,請(qǐng)問(wèn)這樣子的Demo該如何實(shí)現(xiàn)?
LocationTool獲取當(dāng)前位置信息
Android手機(jī)獲取當(dāng)前位置的方式:GPS定位,WIFI定位,基站定位,當(dāng)前Demo使用GPS衛(wèi)星定位,在LocationTool中返回Location、LocationManager兩者對(duì)象,通過(guò)Location提供的getLatitude()、getLongitude()讀取經(jīng)緯度數(shù)據(jù),同時(shí)添加位置改變監(jiān)聽(tīng)器MyLocationListener,具體代碼如下:
package cn.teachcourse.utils; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.widget.Toast; /* @author postmaster@teachcourse.cn @date 創(chuàng)建于:2016-1-22 */ public class LocationTool { public Location getLocation() { return mLocation; } public void setLocation(Location location) { this.mLocation = location; } private Context context; private Location mLocation; private LocationManager mLocationManager; public LocationTool(Context context) { super(); mLocationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); mLocation = mLocationManager.getLastKnownLocation(getProvider()); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, new MyLocationListener(this)); } // 獲取Location Provider private String getProvider() { // 構(gòu)建位置查詢條件 Criteria criteria = new Criteria(); // 查詢精度:高 criteria.setAccuracy(Criteria.ACCURACY_FINE); // 是否查詢海撥:否 criteria.setAltitudeRequired(false); // 是否查詢方位角 : 否 criteria.setBearingRequired(false); // 是否允許付費(fèi):是 criteria.setCostAllowed(true); // 電量要求:低 criteria.setPowerRequirement(Criteria.POWER_LOW); // 返回最合適的符合條件的provider,第2個(gè)參數(shù)為true說(shuō)明 , 如果只有一個(gè)provider是有效的,則返回當(dāng)前provider return mLocationManager.getBestProvider(criteria, true); } public LocationManager getLocationManager() { return mLocationManager; } private LocationListener mLocationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { Location l = mLocationManager.getLastKnownLocation(provider); if (l != null) { mLocation = l; } } @Override public void onProviderDisabled(String provider) { mLocation = null; } @Override public void onLocationChanged(Location location) { if (location != null) { mLocation = location; } } }; public void closeLocation() { if (mLocationManager != null) { if (mLocationManager != null) { mLocationManager.removeUpdates(mLocationListener); mLocationListener = null; } mLocationManager = null; } } }
MyLocationListener位置改變監(jiān)聽(tīng)器
LocationManager對(duì)象調(diào)用requestLocationUpdates(String provider, long minTime, float minDistance,LocationListener listener),在回調(diào)的方法中獲取改變后的Location對(duì)象,其中provider表示LocationManager.GPS_PROVIDER,minTime表示最短時(shí)間間隔內(nèi)更新位置信息(單位毫秒),minDistance表示最短距離內(nèi)更新位置信息(單位米),MyLocationListener繼承LocationListener,需要重寫(xiě)的方法如下:
package cn.teachcourse.utils; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; /* @author postmaster@teachcourse.cn @date 創(chuàng)建于:2016-1-22 */ public class MyLocationListener implements LocationListener { private LocationTool gpsTool; /**構(gòu)造方法,傳入LocationTool * @param gpsTool */ public MyLocationListener(LocationTool gpsTool) { super(); this.gpsTool = gpsTool; } /** * 當(dāng)前位置改變后,回調(diào)onLocationChanged方法,獲取改變后的Location對(duì)象 * */ @Override public void onLocationChanged(Location location) { if (location != null) { gpsTool.setLocation(location); } } /** * 當(dāng)provider狀態(tài)改變時(shí)回調(diào)的方法,當(dāng)前的provider無(wú)法讀取位置信息或者provider從無(wú)法讀取位置信息變?yōu)槟軌蜃x取為信息被回調(diào)的方法 * */ @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } /** * 當(dāng)provider被用戶允許開(kāi)啟,回調(diào)的onProviderEnabled方法,比如:開(kāi)啟定位功能,回調(diào)該方法 * */ @Override public void onProviderEnabled(String provider) { Location l = gpsTool.getLocationManager() .getLastKnownLocation(provider); if (l != null) { gpsTool.setLocation(l); } } /** * 當(dāng)provider不被用戶允許開(kāi)啟,回調(diào)的onProviderDisabled方法,比如:無(wú)法開(kāi)啟定位功能,回調(diào)該方法 * */ @Override public void onProviderDisabled(String provider) { gpsTool.setLocation(null); } }
LocationService服務(wù)讀取位置信息
為什么要開(kāi)啟Service呢?Service和Activity、Fragment一樣也有自己的生命周期,onCreate——>onStartCommand(onStart)——>onUnbind——>onRebind——>onDestroy,在LocationService執(zhí)行的操作是啟動(dòng)一個(gè)線程獲取更新后的位置信息,并以廣播的方式發(fā)送出去,具體代碼如下:
package cn.teachcourse.utils; import android.app.Activity; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.IBinder; import android.provider.Settings; import android.widget.Toast; /* @author postmaster@teachcourse.cn @date 創(chuàng)建于:2016-1-22 */ public class LocationService extends Service { private LocationTool mGPSTool = null; private boolean threadDisable = false; private final static String TAG = LocationService.class.getSimpleName(); @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); mGPSTool = new LocationTool(this); startThread(); } private void startThread() { new Thread(new Runnable() { @Override public void run() { while (!threadDisable) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (mGPSTool != null) { // 當(dāng)結(jié)束服務(wù)時(shí)gps為空 // 獲取經(jīng)緯度 Location location = mGPSTool.getLocation(); // 發(fā)送廣播 Intent intent = new Intent(); intent.putExtra("lat", location == null ? "" : location.getLatitude() + ""); intent.putExtra("lon", location == null ? "" : location.getLongitude() + ""); intent.setAction("cn.teachcourse.utils.GPSService"); sendBroadcast(intent); } } } }).start(); } @Override public void onDestroy() { super.onDestroy(); threadDisable = true; if (mGPSTool != null) { mGPSTool.closeLocation(); mGPSTool = null; } } @Override public IBinder onBind(Intent intent) { return null; } }
MainActivity啟動(dòng)服務(wù)、注冊(cè)廣播、顯示位置信息
在MainActivity需要做的事情有:第一啟動(dòng)LocationService服務(wù),調(diào)用startService()方法;第二注冊(cè)廣播接收器(BroadcastReceiver),創(chuàng)建了一個(gè)內(nèi)部類(lèi)MyBroadcastReceiver,繼承BroadcastReceiver,重寫(xiě)onReceive方法;第三獲取經(jīng)緯度數(shù)據(jù),更新UI界面,顯示當(dāng)前位置信息,具體代碼如下:
//啟動(dòng)服務(wù) startService(new Intent(this, LocationService.class)); //注冊(cè)廣播 private class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); String lon = bundle.getString("lon"); String lat = bundle.getString("lat"); if (!TextUtils.isEmpty(lon) && !TextUtils.isEmpty(lat)) { mLatitude = lat; mLongitude = lon; isObtainLoc = true; new Thread(new Runnable() { @Override public void run() { Message msg = new Message(); msg.what = REFRESH_UI;// 發(fā)送消息,通知刷新界面 mHandler.sendMessage(msg); } }).start(); } } } //更新UI界面 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case REFRESH_UI: reFreshUI(); break; default: break; } } }; private void reFreshUI() { if (isObtainLoc) { mTextView.setText("目前經(jīng)緯度\n經(jīng)度:" + mLongitude + "\n緯度:" + mLatitude); mDialog.dismiss(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。
- Android通過(guò)原生方式獲取經(jīng)緯度與城市信息的方法
- Android GPS獲取當(dāng)前經(jīng)緯度坐標(biāo)
- Android通過(guò)原生APi獲取所在位置的經(jīng)緯度
- Android編程實(shí)現(xiàn)根據(jù)經(jīng)緯度查詢地址并對(duì)獲取的json數(shù)據(jù)進(jìn)行解析的方法
- android通過(guò)gps獲取定位的位置數(shù)據(jù)和gps經(jīng)緯度
- Android獲取經(jīng)緯度計(jì)算距離介紹
- Android 通過(guò)當(dāng)前經(jīng)緯度獲得城市的實(shí)例代碼
- android手機(jī)獲取gps和基站的經(jīng)緯度地址實(shí)現(xiàn)代碼
- Android獲取經(jīng)緯度的完美解決方案
相關(guān)文章
Android RecyclerView滾動(dòng)定位
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView滾動(dòng)定位的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android中實(shí)現(xiàn)ProgressBar菊花旋轉(zhuǎn)進(jìn)度條的動(dòng)畫(huà)效果
大家在一些頁(yè)面經(jīng)常會(huì)遇到加載中需要顯示一個(gè)加載動(dòng)畫(huà),像旋轉(zhuǎn)的菊花旋轉(zhuǎn)的圈圈動(dòng)畫(huà)效果,本文通過(guò)實(shí)例代碼給大家講解下,需要的朋友參考下吧2021-09-09RelativeLayout(相對(duì)布局)用法實(shí)例講解
在本文里小編給大家分享了關(guān)于RelativeLayout(相對(duì)布局)用法知識(shí)點(diǎn)以及對(duì)應(yīng)的實(shí)例內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-02-02Android 重寫(xiě)ViewGroup 分析onMeasure()和onLayout()方法
這篇文章主要介紹了Android 重寫(xiě)ViewGroup 分析onMeasure()和onLayout()方法的相關(guān)資料,需要的朋友可以參考下2017-06-06Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例
本篇文章主要介紹了Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02超詳細(xì)的Android開(kāi)發(fā)調(diào)試工具ADB命令及安裝介紹
這篇文章主要介紹了Android調(diào)試工具ADB安裝使用技巧,非常詳細(xì),有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升值加薪2021-09-09Android中使用DialogFragment編寫(xiě)對(duì)話框的實(shí)例教程
這篇文章主要介紹了Android中使用DialogFragment編寫(xiě)對(duì)話框的實(shí)例教程,DialogFragment也是一種Fragment,因而管理生命周期時(shí)比較給力,需要的朋友可以參考下2016-04-04解析Android中實(shí)現(xiàn)滑動(dòng)翻頁(yè)之ViewFlipper的使用詳解
有一些場(chǎng)景,我們需要向用戶展示一系列的頁(yè)面。比如我們正在開(kāi)發(fā)一個(gè)看漫畫(huà)的應(yīng)用,可能就需要向用戶展示一張一張的漫畫(huà)圖片,用戶使用手指滑動(dòng)屏幕,可以在前一幅漫畫(huà)和后一幅漫畫(huà)之間切換。這個(gè)時(shí)候ViewFlipper就是一個(gè)很好的選擇2013-05-05