android提供了LocationManager来取得位置,用LocationListener来监听位置的变化

先做一些初始化工作:

/** latitude and longitude of current location*/public static String mLat = "";public static String mLon = "";/** time out for GPS location update */private  Timer mGpsTimer = new Timer();/** TimerTask for time out of GPS location update */private  GpsTimeOutTask mGpsTimeOutTask = new GpsTimeOutTask();/** GPS location update time out in milliseconds*/private  long mGpsTimeOut = 180000;//3 minutes<span style="white-space:pre"></span>public void initiLocationUtil (Context context, LocationObsever locationobsever){mLocationObsever = locationobsever;mContext = context;mLocationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);mLocationListener = new MyLocationListener();}


<span style="white-space:pre"></span>public void RefreshGPS(boolean calledByCreate){mLocationManager.removeUpdates(mLocationListener);boolean providerEnable = true;boolean showLocationServiceDisableNotice = true;//看是否有GPS权限if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){//開始进行定位 mLocationListener为位置监听器mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);showLocationServiceDisableNotice = false;//start time out timer mGpsTimer = new Timer(); mGpsTimeOutTask = new GpsTimeOutTask();mGpsTimer.schedule(mGpsTimeOutTask, mGpsTimeOut);}if(mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);showLocationServiceDisableNotice = false;providerEnable = true;}if(providerEnable){if(mLocationObsever != null){mLocationObsever.notifyChange(REFRESHGPS_COMPLETED, null);}}else{if(mLocationObsever != null){mLocationObsever.notifyChange(REFRESHGPS_NOPROVIDER, null);}}if(showLocationServiceDisableNotice){showLocationServiceDisabledDialog();}}


监听器:

private  class MyLocationListener implements LocationListener{private boolean mLocationReceived = false;@Overridepublic void onLocationChanged(Location location) {if(location != null && !mLocationReceived){mLocationReceived = true;String lon = String.valueOf(location.getLongitude());String lat = String.valueOf(location.getLatitude());if(mLocationObsever != null){mLocationObsever.notifyChange(DEFAULT_LOCATION_COMPLETED, lat+","+lon);}}else  if(location == null){if(mLocationObsever != null){mLocationObsever.notifyChange(GETLOCATION_FAILED, null);}}}@Overridepublic void onProviderDisabled(String provider) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onStatusChanged(String provider, int status,Bundle extras) {// TODO Auto-generated method stub//if GPS provider is not accessible, try network providerif(provider.equals(LocationManager.GPS_PROVIDER) && status != LocationProvider.AVAILABLE){if(mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);}else{mLocationManager.removeUpdates(mLocationListener);if(mLocationObsever != null){mLocationObsever.notifyChange(STATUS_CHANGED, null);}}}}}


这里用了一个Timer,3分钟后又一次去取一次位置:

private Handler mGpsTimerHandler = new Handler() {public void handleMessage(Message msg) {if (mLocationManager == null) {return;}if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {System.out.println("=====use network to get location");mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,mLocationListener);} else {mLocationManager.removeUpdates(mLocationListener);// mLocationObsever.notifyChange(SETADDLOCATIONBUTTONSTATE_1_SETLOCATIONDES_1,null);if (mLocationObsever != null) {mLocationObsever.notifyChange(GPSTIMEOUT, null);}}}};

界面退出的时候要关掉GPS

/** * cancel operations of refreshing GPS     */public  void cancelRefreshGPS(){if(mLocationManager != null){mLocationManager.removeUpdates(mLocationListener);}if(mLocationObsever != null){mLocationObsever.notifyChange(CANCELGPS_COMPLETED, null);}}public  void destroy (){if(mLocationManager != null){     mLocationManager.removeUpdates(mLocationListener);}if(mGpsTimer != null){mGpsTimer.cancel();} cancelRefreshGPS();mContext = null;mLocationObsever = null;mLocationBuildingList = null;System.gc();}

截图是

android取得所在位置的经纬度_第1张图片


点击MAP的时候,假设採用google map,必须使用sdk带有google api,然后在application中增加<uses-library android:name="com.google.android.maps" />

然后xml是:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="#FFFFFF"    android:gravity="center_horizontal"    android:orientation="vertical" >    <include layout="@layout/title_list" />    <View        android:id="@+id/line"        android:layout_width="fill_parent"        android:layout_height="2dip"        android:layout_below="@id/title"        android:background="@drawable/rc_list_divider" />    <com.google.android.maps.MapView        android:id="@+id/mapview"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:apiKey="06nx-Rzpy8WU16_gjO8ZbtRYYY-junnxNArrxFg" /></LinearLayout>

代码是:

@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.around_map);mTextView = (TextView)findViewById(R.id.title_text);mTextView.setText("地图");Intent intent = getIntent();mLatitude = intent.getDoubleExtra("lat", 0.0);mLongitude = intent.getDoubleExtra("lon", 0.0);mMapView = (MapView) findViewById(R.id.mapview);      mMapView.setClickable(true);      mMapView.setBuiltInZoomControls(true);mMapView.setSatellite(true);    mapController = mMapView.getController();//    geoPoint = new GeoPoint((int)(mLatitude * 1E6), (int)(mLongitude * 1E6));      geoPoint=new GeoPoint((int)(30.659259*1000000),(int)(104.065762*1000000));    mMapView.displayZoomControls(true);     //    //  设置地图的初始大小。范围在1和21之间。1:最小尺寸,21:最大尺寸    mapController.setZoom(16);//    ////  创建MyOverlay对象,用于在地图上绘制图形      MyOverlay myOverlay = new MyOverlay();      mMapView.getOverlays().add(myOverlay);             mapController.animateTo(geoPoint);  }@Overrideprotected boolean isRouteDisplayed() {return false;}class MyOverlay extends Overlay  {      @Override      public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)      {          Paint paint = new Paint();                  //屏幕上文字字体颜色        paint.setColor(Color.RED);          Point screenPoint = new Point();                    mapView.getProjection().toPixels(geoPoint, screenPoint);          Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.location);          //  在地图上绘制图像          canvas.drawBitmap(bmp, screenPoint.x, screenPoint.y, paint);          //  在地图上绘制文字  //        canvas.drawText("移动巴士", 10, 100, paint);          return super.draw(canvas, mapView, shadow, when);      }  } 


代码能够在http://download.csdn.net/detail/baidu_nod/7622677下载


更多相关文章

  1. 自制Android下的播放器(音频来源SD卡上的固定位置)
  2. 输入键盘始终停留以及尺寸转换得到默认字体大小
  3. Android通过基站获取地理位置
  4. Android 铃声设置界面,起始位置为当前已选项
  5. Android 相机2之常用工具代码(预览方向、预览尺寸、全屏显示、分
  6. MTK平台修改音量默认值需要改动的位置
  7. 如何在Android 11 中正确请求位置权限?以及Android 8 - 11位置权
  8. Android中PopupWindow的用法(位置、动画、焦点)
  9. Android中利用SpannableString实现点击同一按钮(Button)不同位置

随机推荐

  1. Android Volley完全解析(三),定制自己的Re
  2. android开发之Android ActionBar完全解析
  3. android 键对应的号码
  4. 深入Activity
  5. Android侧滑菜单DrawerLayout的使用
  6. android ndk 调用第三方so
  7. Android前置摄像头预览并检测人脸,获取人
  8. Android基于ViewFilpper实现文字LED显示
  9. Android中px dpi dip density densityDpi
  10. Android有用代码片段(三)