[Android] Google Map(二)GPS & WIFI 定位监听

上一篇我们用了MyLocationOverlay,他会依照Wi-Fi或是GPS的定位信息自行更新。但如果是我们自己想要监听这些信息,就必须利用LocationManager了。但首先我们必须要求使用者启用相关功能才可以。 

下面的程序代码是判断使用者是否启用了GPS定位,若是没启用,询问是否需要开启,使用者若选择确定,则开启设定接口:

[java]  view plain copy
  1. LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  2. if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))  
  3. {  
  4.   
  5.     new AlertDialog.Builder(MeteorMap.this).setTitle("地图工具").setMessage("您尚未开启定位服务,要前往设定页面启动定位服务吗?")  
  6.             .setCancelable(false).setPositiveButton("OK"new DialogInterface.OnClickListener()  
  7.             {  
  8.   
  9.                 public void onClick(DialogInterface dialog, int which)  
  10.                 {  
  11.                     startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));  
  12.                 }  
  13.             }).setNegativeButton("Cancel"new DialogInterface.OnClickListener()  
  14.             {  
  15.                 public void onClick(DialogInterface dialog, int which)  
  16.                 {  
  17.                     Toast.makeText(MeteorMap.this"未开启定位服务,无法使用本工具!!", Toast.LENGTH_SHORT).show();  
  18.                 }  
  19.             }).show();  
  20.   
  21. }  

当确定启用之后,接下来就是开启监听啦!这边为了省事,所以直接利用原本的Activity实作LocationListener接口,然后注册监听事件:

[java]  view plain copy
  1. //WI-FI定位  
  2. locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, MeteorMap.this);  
  3. //GPS 定位  
  4. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, MeteorMap.this);  

注:平常我们开发通常在室内,所以GPS讯号应该是收不到,同时注册网络定位可以方便测试,但实际上使用如果要求准确,就只需要注册GPS定位! 

若是要取消则只要:

[java]  view plain copy
  1. locationManager.removeUpdates(MeteorMap.this);  

 接下来只要利用LocationListener的事件,我们可以就利用onLocationChanged事件来取得当前的定位信息!

再来就要调整一下前一篇写的程序,加上判断以及注册跟取消监听,不过在那之前要先来了解一下Activity的生命周期:

 image

当程序建立之后,若使用者跳离开画面会进入onPause()事件(不管是关闭程序还是直接启动别的程序),另外就是当使用者又回到程序画面时都需要判断是否启用相关设定以及重新注册事件,所以我覆写原有的onResume以及onPause来处理这些设定。

 

以下是完整程序:

 

[java]  view plain copy
  1. package demo.meteor.android.meteormap;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.google.android.maps.MapActivity;  
  6. import com.google.android.maps.MapController;  
  7. import com.google.android.maps.MapView;  
  8. import com.google.android.maps.MyLocationOverlay;  
  9. import com.google.android.maps.Overlay;  
  10.   
  11. import android.app.AlertDialog;  
  12. import android.content.Context;  
  13. import android.content.DialogInterface;  
  14. import android.content.Intent;  
  15. import android.location.Location;  
  16. import android.location.LocationListener;  
  17. import android.location.LocationManager;  
  18. import android.os.Bundle;  
  19. import android.provider.Settings;  
  20. import android.util.Log;  
  21. import android.widget.Toast;  
  22.   
  23. public class MeteorMap extends MapActivity implements LocationListener  
  24. {  
  25.     private LocationManager locationManager;  
  26.   
  27.     private MapView mapView;  
  28.     private MapController mapController;  
  29.     private MyLocationOverlay mylayer;  
  30.   
  31.     private boolean enableTool;  
  32.   
  33.     /** Called when the activity is first created. */  
  34.     @Override  
  35.     public void onCreate(Bundle savedInstanceState)  
  36.     {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.main);  
  39.         findControl();  
  40.   
  41.     }  
  42.   
  43.     private void init()  
  44.     {  
  45.         if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))  
  46.         {  
  47.   
  48.             new AlertDialog.Builder(MeteorMap.this).setTitle("地图工具").setMessage("您尚未开启定位服务,要前往设定页面启动定位服务吗?")  
  49.                     .setCancelable(false).setPositiveButton("OK"new DialogInterface.OnClickListener()  
  50.                     {  
  51.   
  52.                         public void onClick(DialogInterface dialog, int which)  
  53.                         {  
  54.                             startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));  
  55.                         }  
  56.                     }).setNegativeButton("Cancel"new DialogInterface.OnClickListener()  
  57.                     {  
  58.                         public void onClick(DialogInterface dialog, int which)  
  59.                         {  
  60.                             Toast.makeText(MeteorMap.this"未开启定位服务,无法使用本工具!!", Toast.LENGTH_SHORT).show();  
  61.                         }  
  62.                     }).show();  
  63.   
  64.         }  
  65.         else  
  66.         {  
  67.             enableMyLocation();  
  68.             enableTool = true;  
  69.         }  
  70.   
  71.     }  
  72.   
  73.     private void findControl()  
  74.     {  
  75.         mapView = (MapView) findViewById(R.id.mapView);  
  76.         mapView.setBuiltInZoomControls(true);  
  77.   
  78.         mapController = mapView.getController();  
  79.         mapController.setZoom(16);  
  80.   
  81.         locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  82.         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, MeteorMap.this);  
  83.         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, MeteorMap.this);  
  84.     }  
  85.   
  86.     private void enableMyLocation()  
  87.     {  
  88.         // 定位点  
  89.         List<Overlay> overlays = mapView.getOverlays();  
  90.         mylayer = new MyLocationOverlay(this, mapView);  
  91.         mylayer.enableCompass();  
  92.         mylayer.enableMyLocation();  
  93.         mylayer.runOnFirstFix(new Runnable()  
  94.         {  
  95.   
  96.             public void run()  
  97.             {  
  98.                 mapController.animateTo(mylayer.getMyLocation());  
  99.             }  
  100.         });  
  101.         overlays.add(mylayer);  
  102.     }  
  103.   
  104.     @Override  
  105.     protected void onResume()  
  106.     {  
  107.         super.onResume();  
  108.         if (enableTool)  
  109.         {  
  110.             locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, MeteorMap.this);  
  111.             locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, MeteorMap.this);  
  112.             mylayer.enableMyLocation();  
  113.             mylayer.enableCompass();  
  114.         }  
  115.         else  
  116.         {  
  117.             init();  
  118.         }  
  119.     }  
  120.   
  121.     @Override  
  122.     protected void onPause()  
  123.     {  
  124.         super.onPause();  
  125.         if (enableTool)  
  126.         {  
  127.             locationManager.removeUpdates(MeteorMap.this);  
  128.             mylayer.disableCompass();  
  129.             mylayer.disableMyLocation();  
  130.   
  131.         }  
  132.     }  
  133.   
  134.     @Override  
  135.     protected boolean isRouteDisplayed()  
  136.     {  
  137.         // TODO Auto-generated method stub  
  138.         return false;  
  139.     }  
  140.   
  141.     @Override  
  142.     public void onLocationChanged(Location location)  
  143.     {  
  144.         Log.v("map", location.toString());  
  145.   
  146.     }  
  147.   
  148.     @Override  
  149.     public void onProviderDisabled(String provider)  
  150.     {  
  151.         // TODO Auto-generated method stub  
  152.   
  153.     }  
  154.   
  155.     @Override  
  156.     public void onProviderEnabled(String provider)  
  157.     {  
  158.         // TODO Auto-generated method stub  
  159.   
  160.     }  
  161.   
  162.     @Override  
  163.     public void onStatusChanged(String provider, int status, Bundle extras)  
  164.     {  
  165.         // TODO Auto-generated method stub  
  166.   
  167.     }  
  168. }  


因为这篇我只是把收到的定位信息写到讯息窗口,所以会看到的内容是:

Location[mProvider=network,mTime=1306399187835,mLatitude=24.9692934,mLongitude=121.23618125,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=60.0,mExtras=Bundle[mParcelledData.dataSize=148]]

 

后面就来拿这个玩啰!

 

原文来自:http://www.dotblogs.com.tw/alonstar/archive/2011/05/26/26303.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值