天天看点

Android下实现GPS定位服务

1.申请Google API Key,参考前面文章

2.实现GPS的功能需要使用模拟器进行经纬度的模拟设置,请参考前一篇文章进行设置

3.创建一个Build Target为Google APIs的项目

4.修改Androidmanifest文件:

<uses-library android:name="com.google.android.maps" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

5.修改main.xml文件

<com.google.android.maps.MapView android:id="@+id/MapView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0f8FBFJliR7j_7aNwDxClBv6VW8O12V2Y21W_CQ"/>

注意:这里的apiKey值请相应修改为自己的key值

6.代码清单:

package com.hoo.android.LocationMap; import java.io.IOException; import java.util.List; import java.util.Locale; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; public class ActivityLocationMap extends MapActivity { public MapController mapController; public MyLocationOverlay myPosition; public MapView myMapView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得LocationManager实例 LocationManager locationManager; String context=Context.LOCATION_SERVICE; locationManager=(LocationManager)getSystemService(context); myMapView=(MapView)findViewById(R.id.MapView01); //取得MapController实例,控制地图 mapController=myMapView.getController(); //设置显示模式为街景模式 myMapView.setStreetView(true); //*************使用系统自带的控件放大缩小视图*************************** //取得MapController对象(控制MapView) mapController = myMapView.getController(); //设置地图支持设置模式 myMapView.setEnabled(true); //设置地图支持点击 myMapView.setClickable(true); //设置缩放控制,这里我们自己实现缩放菜单 myMapView.displayZoomControls(true); myMapView.setBuiltInZoomControls(true); //******************************************************************* 设置设置地图目前缩放大小倍数(从1到21) mapController.setZoom(17); //设置使用MyLocationOverlay来绘图 myPosition=new MyLocationOverlay(); List<Overlay> overlays=myMapView.getOverlays(); overlays.add(myPosition); //设置Criteria(标准服务商)的信息 Criteria criteria =new Criteria(); //*****设置服务商提供的精度要求,以供筛选提供商************************ criteria.setAccuracy(Criteria.POWER_HIGH);//表明所要求的经纬度的精度 criteria.setAltitudeRequired(false); //高度信息是否需要提供 criteria.setBearingRequired(false); //压力(气压?)信息是否需要提供 criteria.setCostAllowed(false); //是否会产生费用 criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//最大需求标准 //***************************************************** //取得效果最好的criteria String provider=locationManager.getBestProvider(criteria, true); //得到坐标相关的信息 Location location=locationManager.getLastKnownLocation(provider); //更新位置信息 updateWithNewLocation(location); //注册一个周期性的更新,3000ms更新一次,0代表最短距离 //locationListener用来监听定位信息的改变(OnLocationChanged) locationManager.requestLocationUpdates(provider, 3000, 0,locationListener); } //更新位置信息 private void updateWithNewLocation(Location location) { String latLongString; //声明经纬度的字符串 TextView myLocationText = (TextView)findViewById(R.id.TextView01); //初始化地址为没有找到,便于处理特殊情况 String addressString="没有找到地址\n"; if(location!=null) { //****************获取当前的经纬度,并定位到目标************************* //为绘制标志的类设置坐标 myPosition.setLocation(location); //取得经度和纬度 Double geoLat=location.getLatitude()*1E6; Double geoLng=location.getLongitude()*1E6; //将其转换为int型 GeoPoint point=new GeoPoint(geoLat.intValue(),geoLng.intValue()); //定位到指定坐标 mapController.animateTo(point); //********************************************************************* double lat=location.getLatitude(); //获得经纬度 double lng=location.getLongitude(); latLongString="经度:"+lat+"\n纬度:"+lng; //设置经纬度字符串 // double latitude=location.getLatitude(); //double longitude=location.getLongitude(); //根据地理位置来确定编码 Geocoder gc=new Geocoder(this,Locale.getDefault()); try { //取得地址相关的一些信息:经度、纬度 List<Address> addresses=gc.getFromLocation(lat, lng,1); StringBuilder sb=new StringBuilder(); if(addresses.size()>0) { Address address=addresses.get(0); for(int i=0;i<address.getMaxAddressLineIndex()-1;i++) sb.append(address.getAddressLine(i)).append(","); //获得地址sb.append(address.getLocality()).append("\n"); //获得邮编sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); addressString=sb.toString(); } }catch(IOException e){} } else { latLongString="没有找到坐标.\n"; } //显示 myLocationText.setText("您当前的位置如下:\n"+latLongString+"\n"+addressString); } //监听位置信息的改变 private final LocationListener locationListener=new LocationListener() { //当坐标改变时触发此函数 public void onLocationChanged(Location location) { updateWithNewLocation(location); } //Provider被disable时触发此函数,比如GPS被关闭 public void onProviderDisabled(String provider) { updateWithNewLocation(null); } //Provider被enable时触发此函数,比如GPS被打开 public void onProviderEnabled(String provider){} //Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 public void onStatusChanged(String provider,int status,Bundle extras){} }; //方法默认是true,服务器所知的状态列信息是否需要显示 protected boolean isRouteDisplayed() { return false; } class MyLocationOverlay extends Overlay { Location mLocation; //在更新坐标,以便画图 public void setLocation(Location location) { mLocation = location; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { super.draw(canvas, mapView, shadow); Paint paint = new Paint(); Point myScreenCoords = new Point(); // 将经纬度转换成实际屏幕坐标 GeoPoint tmpGeoPoint = new GeoPoint((int)(mLocation.getLatitude()*1E6),(int)(mLocation.getLongitude()*1E6)); mapView.getProjection().toPixels(tmpGeoPoint, myScreenCoords); //*********paint相关属性设置********* paint.setStrokeWidth(0);//文 paint.setARGB(255, 255, 0, 0); paint.setStyle(Paint.Style.STROKE); //*********************************** Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.green_dot); canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint); canvas.drawText("您目前的位置", myScreenCoords.x, myScreenCoords.y, paint); return true; } } }

代码参考网络,加以修改优化,谢谢

7.程序运行截图,前提是在命令行下输入geo fix 121.5 31.24(定位到上海东方明珠),在命令行下可以输入其他坐标,系统会根据坐标显示其他位置,如接着输入geo fix 113.325 23.113(定位到广州海心沙),不知为什么输入坐标的时候经常会不识别,有时能够成功而有时不行,郁闷,求解……

Android下实现GPS定位服务
Android下实现GPS定位服务