下面的程序代码是判断使用者是否启用了GPS定位,若是没启用,询问是否需要开启,使用者若选择确定,则开启设定接口:
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
- {
- new AlertDialog.Builder(MeteorMap.this).setTitle("地图工具").setMessage("您尚未开启定位服务,要前往设定页面启动定位服务吗?")
- .setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener()
- {
- public void onClick(DialogInterface dialog, int which)
- {
- startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
- }
- }).setNegativeButton("Cancel", new DialogInterface.OnClickListener()
- {
- public void onClick(DialogInterface dialog, int which)
- {
- Toast.makeText(MeteorMap.this, "未开启定位服务,无法使用本工具!!", Toast.LENGTH_SHORT).show();
- }
- }).show();
- }
当确定启用之后,接下来就是开启监听啦!这边为了省事,所以直接利用原本的Activity实作LocationListener接口,然后注册监听事件:
- //WI-FI定位
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, MeteorMap.this);
- //GPS 定位
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, MeteorMap.this);
注:平常我们开发通常在室内,所以GPS讯号应该是收不到,同时注册网络定位可以方便测试,但实际上使用如果要求准确,就只需要注册GPS定位!
若是要取消则只要:
- locationManager.removeUpdates(MeteorMap.this);
接下来只要利用LocationListener的事件,我们可以就利用onLocationChanged事件来取得当前的定位信息!
再来就要调整一下前一篇写的程序,加上判断以及注册跟取消监听,不过在那之前要先来了解一下Activity的生命周期:
当程序建立之后,若使用者跳离开画面会进入onPause()事件(不管是关闭程序还是直接启动别的程序),另外就是当使用者又回到程序画面时都需要判断是否启用相关设定以及重新注册事件,所以我覆写原有的onResume以及onPause来处理这些设定。
以下是完整程序:
- package demo.meteor.android.meteormap;
- import java.util.List;
- import com.google.android.maps.MapActivity;
- import com.google.android.maps.MapController;
- import com.google.android.maps.MapView;
- import com.google.android.maps.MyLocationOverlay;
- import com.google.android.maps.Overlay;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.os.Bundle;
- import android.provider.Settings;
- import android.util.Log;
- import android.widget.Toast;
- public class MeteorMap extends MapActivity implements LocationListener
- {
- private LocationManager locationManager;
- private MapView mapView;
- private MapController mapController;
- private MyLocationOverlay mylayer;
- private boolean enableTool;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- findControl();
- }
- private void init()
- {
- if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
- {
- new AlertDialog.Builder(MeteorMap.this).setTitle("地图工具").setMessage("您尚未开启定位服务,要前往设定页面启动定位服务吗?")
- .setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener()
- {
- public void onClick(DialogInterface dialog, int which)
- {
- startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
- }
- }).setNegativeButton("Cancel", new DialogInterface.OnClickListener()
- {
- public void onClick(DialogInterface dialog, int which)
- {
- Toast.makeText(MeteorMap.this, "未开启定位服务,无法使用本工具!!", Toast.LENGTH_SHORT).show();
- }
- }).show();
- }
- else
- {
- enableMyLocation();
- enableTool = true;
- }
- }
- private void findControl()
- {
- mapView = (MapView) findViewById(R.id.mapView);
- mapView.setBuiltInZoomControls(true);
- mapController = mapView.getController();
- mapController.setZoom(16);
- locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, MeteorMap.this);
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, MeteorMap.this);
- }
- private void enableMyLocation()
- {
- // 定位点
- List<Overlay> overlays = mapView.getOverlays();
- mylayer = new MyLocationOverlay(this, mapView);
- mylayer.enableCompass();
- mylayer.enableMyLocation();
- mylayer.runOnFirstFix(new Runnable()
- {
- public void run()
- {
- mapController.animateTo(mylayer.getMyLocation());
- }
- });
- overlays.add(mylayer);
- }
- @Override
- protected void onResume()
- {
- super.onResume();
- if (enableTool)
- {
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, MeteorMap.this);
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, MeteorMap.this);
- mylayer.enableMyLocation();
- mylayer.enableCompass();
- }
- else
- {
- init();
- }
- }
- @Override
- protected void onPause()
- {
- super.onPause();
- if (enableTool)
- {
- locationManager.removeUpdates(MeteorMap.this);
- mylayer.disableCompass();
- mylayer.disableMyLocation();
- }
- }
- @Override
- protected boolean isRouteDisplayed()
- {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void onLocationChanged(Location location)
- {
- Log.v("map", location.toString());
- }
- @Override
- public void onProviderDisabled(String provider)
- {
- // TODO Auto-generated method stub
- }
- @Override
- public void onProviderEnabled(String provider)
- {
- // TODO Auto-generated method stub
- }
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras)
- {
- // TODO Auto-generated method stub
- }
- }
因为这篇我只是把收到的定位信息写到讯息窗口,所以会看到的内容是:
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