不说废话,直接说说实现android定位有关的API吧。

这些API都在android.location包下,一共有三个接口和八个类。它们配合使用即可实现定位功能。

三个接口

GpsStatus.Listener:这是一个当GPS状态发生改变时,用来接收通知的接口。

GpsStatus.NmeaListener:这是一个用来从GPS里接收Nmea-0183(为海用电子设备制定的标准格式)信息的接口。

LocationListener:位置监听器,用于接收当位置信息发生改变时从LocationManager接收通知的接口。

八个类

Address:描述地址的类,比如:北京天安门

Criteria:用于描述Location Provider标准的类,标准包括位置精度水平,电量消耗水平,是否获取海拔、方位信息,是否允许接收付费服务。

GeoCoder:用于处理地理位置的编码。

GpsSatellite:和GpsStatus联合使用,用于描述当前GPS卫星的状态。

GpsStatus:和GpsStatus.Listener联合使用,用于描述当前GPS卫星的状态。

Location:用于描述位置信息。

LocationManager:通过此类获取和调用系统位置服务

LocationProvider:用于描述Location Provider的抽象超类,一个LocationProvider应该能够周期性的报告当前设备的位置信息。

这里通过一个示例代码来演示一下android定位。

首先,在AndroidManifest.xml清单文件里需要加入ACCESS_FINE_LOCATION权限:

?
1 < uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" ></ uses-permission >

其次,实现代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 package com.test; import java.io.IOException; import java.util.List; import android.app.Activity; 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.util.Log; import android.widget.Toast; public class PositionActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); // 获取到LocationManager对象 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // 创建一个Criteria对象 Criteria criteria = new Criteria(); // 设置粗略精确度 criteria.setAccuracy(Criteria.ACCURACY_COARSE); // 设置是否需要返回海拔信息 criteria.setAltitudeRequired( false ); // 设置是否需要返回方位信息 criteria.setBearingRequired( false ); // 设置是否允许付费服务 criteria.setCostAllowed( true ); // 设置电量消耗等级 criteria.setPowerRequirement(Criteria.POWER_HIGH); // 设置是否需要返回速度信息 criteria.setSpeedRequired( false ); // 根据设置的Criteria对象,获取最符合此标准的provider对象 41 String currentProvider = locationManager .getBestProvider(criteria, true ); Log.d( "Location" , "currentProvider: " + currentProvider); // 根据当前provider对象获取最后一次位置信息 44 Location currentLocation = locationManager .getLastKnownLocation(currentProvider); // 如果位置信息为null,则请求更新位置信息 46 if (currentLocation == null ) { locationManager.requestLocationUpdates(currentProvider, 0 , 0 , locationListener); } // 直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度 50 // 每隔10秒获取一次位置信息 51 while ( true ) { currentLocation = locationManager .getLastKnownLocation(currentProvider); if (currentLocation != null ) { Log.d( "Location" , "Latitude: " + currentLocation.getLatitude()); Log.d( "Location" , "location: " + currentLocation.getLongitude()); break ; } else { Log.d( "Location" , "Latitude: " + 0 ); Log.d( "Location" , "location: " + 0 ); } try { Thread.sleep( 10000 ); } catch (InterruptedException e) { Log.e( "Location" , e.getMessage()); } } // 解析地址并显示 69 Geocoder geoCoder = new Geocoder( this ); try { int latitude = ( int ) currentLocation.getLatitude(); int longitude = ( int ) currentLocation.getLongitude(); List<Address> list = geoCoder.getFromLocation(latitude, longitude, 2 ); for ( int i = 0 ; i < list.size(); i++) { Address address = list.get(i); Toast.makeText( PositionActivity. this , address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG) .show(); } } catch (IOException e) { Toast.makeText(PositionActivity. this , e.getMessage(), Toast.LENGTH_LONG).show(); } } // 创建位置监听器 85 private LocationListener locationListener = new LocationListener() { // 位置发生改变时调用 87 @Override public void onLocationChanged(Location location) { Log.d( "Location" , "onLocationChanged" ); Log.d( "Location" , "onLocationChanged Latitude" + location.getLatitude()); Log.d( "Location" , "onLocationChanged location" + location.getLongitude()); } // provider失效时调用 95 @Override public void onProviderDisabled(String provider) { Log.d( "Location" , "onProviderDisabled" ); } // provider启用时调用101 @Override public void onProviderEnabled(String provider) { Log.d( "Location" , "onProviderEnabled" ); } // 状态改变时调用107 @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d( "Location" , "onStatusChanged" ); } }; }

由于代码里的Criteria对象对位置精度要求并不高,所以一般会返回“network”作为provider,而基于network的定位往往会存在一定的位置偏差,这对于需要精确定位的应用程序来说,显然不合要求。这时,需要则需要用到基于GPS的定位方法了

更多相关文章

  1. 读取android手机流量信息
  2. android Dialog大小修改
  3. android用户界面-组件Widget-地图视图MapView
  4. linearLayout 和 relativeLayout的属性区别
  5. 安卓(android)使用GPS,获取经纬度
  6. Android(安卓)MapView 申请apiKey
  7. android adb工具
  8. android开发 列表显示(ListView)
  9. Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)

随机推荐

  1. 最新!!Android 状态栏详细开发,5分钟精通状
  2. Android Opengl开发一
  3. 打造android万能上拉下拉刷新框架——XRe
  4. Android测试方法总结汇总
  5. Android项目源码混淆问题解决方法
  6. android 优秀开源项目收集
  7. Android设置 Wedgit透明度
  8. [教程] [经验技巧] 任意手机移植ROM 教程
  9. Android菜鸟的成长笔记(6)——剖析源码学自
  10. 关于android:background="@drawable/ 出