android取得所在位置的经纬度
16lz
2021-01-23
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();}
截图是
点击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下载
更多相关文章
- 自制Android下的播放器(音频来源SD卡上的固定位置)
- 输入键盘始终停留以及尺寸转换得到默认字体大小
- Android通过基站获取地理位置
- Android 铃声设置界面,起始位置为当前已选项
- Android 相机2之常用工具代码(预览方向、预览尺寸、全屏显示、分
- MTK平台修改音量默认值需要改动的位置
- 如何在Android 11 中正确请求位置权限?以及Android 8 - 11位置权
- Android中PopupWindow的用法(位置、动画、焦点)
- Android中利用SpannableString实现点击同一按钮(Button)不同位置