一、位置服务概念 1.位置服务 位置服务(Location-Based Services,LBS),又称定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供了与个空间位置相关的综合应用服务。 2.GPS与网络位置提供器 Android平台支持提供位置服务的API,可以利用GPS( Global Positioning System, 全球定位系统)和Network Location Provider(网络位置提供器)来获得用户的位置。 (1)GPS相对来说更精确,但它只能在户外工作,很费电,并且不能像用户期望的那样立即就能返回位置信息; (2)Android的网络位置提供器使用手机发射塔和WI-FI信号来判断用户位置,在室内外都能工作、响应速度快、并且更加省点。如果想在应用程序中获得用户的位置,可以同时使用GPS和网络位置提供器,或者其中一种。通过定位服务可以获得当前设备的地理位置,应用程序可以定时请求更新设备当前的地理定位信息,从而达到实时监测的功能。 3.基本框架

二、提供位置服务的核心API Android为支持位置服务,提供了android.location包,该包中包含了与位置信息密切相关的了和接口,主要有:LocationManager、LocationProvider、Location、LocationListener 1.LocationManager (1)功能 定位管理者。该类是访问Android系统位置服务的入口,所有定位相关的服务、对象都将由该类的对象来产生和其他服务一样,程序不能直接创建LocationManager对象,而是通过Context的getSystemService()方法来获取对象: LocationManager locMg=getSystemService(Context.LOCATION_SERVICE); (2)LocationManager中的常用方法 public StringgetBestProvider(Criteria criteria,boolean enabledOnly):根据指定条件返回最优的LocationProvider。其中criteria表示过滤条件,enabledOnly表示是否要求处于启用状态。 public LocationgetLastKnowLocation(String provider):根据LocationProvider获取最近一次已经的Location对象。其中provider表示提供上次位置的LocationProvider名称。
public LocationProvidergetProvider(String name):根据名称返回LocationProvider对象。
public List<String>getProviders(boolean enabledOnly):获取所有可用的LocationProvaider。
public voidrequestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener):通过指定的LocationProvider周期性地获取定位信息,并触发listener所对应的触发器。
public voidaddProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent):添加一个临近警告。即不断监听手机的位置,当手机与固定点的距离小于指定范围时,系统将会触发相应事件,进行处理。其中,latitude指定中心点的经度,longitude指定中心点的纬度,指定一个半径长度,expiration指定经过多少毫秒后该临近警告就会过期失效(-1指定永不过期),intent指定临近该固定点时触发该intent对应的组件。
public voidrequestLocationUpdates(String provider,long minTime,float minDistance,PendingIntent intent):通过指定的LocationProvider周期性地获取定位信息,并通过intent启动相应的组件进行事件处理,provider表示LocationProvider的名称,minTime表示每次更新的时间间隔,单位为毫秒,minDistance表示更新的最近位置,单位为米,intent每次更新时启动的组件。
public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener) :通过指定的LocationProvider周期性地获取定位信息,当位置信息变化时回调LocationListener监听器的onLocationChanged(Location location)方法。其中,minTime为多少时间间隔更新一下位置信息;minDistance为多少距离间隔更新一下位置信息。
2.LocationProvider类 (1)功能 定位提供者。该类是对定位组件的抽象表示,用来提供定位信息,能够周期性的报告设备的地理位置,Android中支持多种LocationProvider,它们以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面。 (2)常用LocationProvider种类 network:由LocationManager.NETWORK_PROVIDER常量表示,代表通过网络获取定位信息的 Location Provider对象; gps:由LocationManager.GPS_PROVIDER常量表示,代表通过GPS获取定位信息的 LocationProvider对象。 (3)LocationProvider中的常用方法 intgetAccuracy():返回该LocationProvider的精度;
intgetPowerRequirement():返回LocationProvider对电量的要求;
StringgetName():返回该LocationProvider的名称;
booleanhasMonetaryCost():判断该LocationProvider是否支持方向信息;
booleansupportsSpeed():判断该LocationProvider是否支持速度信息。
3.Location类 功能: 该类代表位置信息的抽象类,通过Location可获取定位信息的精度、高度、方向、纬度、经度、速度以及改位置的LocationProvider等信息。 4.LocationListener接口 (1)功能 该接口用于监听定位信息的监听器,必须在定位管理器中注册该对象,这样在位置发生变化的时候就会触发相应的方法进行事件处理。 (2)常用方法 public abstract voidonLacationChanged(Location location):位置发生改变时回调该方法;
public abstract voidonProviderDisabled(String provider):Provider禁止时回调该方法;
public abstractvoidonProviderEnabled(String provider):Provider启动时回调该方法;
public abstract voidonStatusChanged(String provider,int status,Bundle extras):当Provider状态发生变化时回调该方法。

三、获取位置信息的一般步骤 1.通过位置服务获取系统的LocationManager对象; 2.使用LocationManager,通过指定LocationProvider来获取Location对象表示定位信息; 3.Location对象中获取位置信息 4.调用LocationManager的requestLocationUpdates方法获取实时位置信息 示例:
  1. LocationManagerlocmgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
  2. Locationloc=locmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  3. doublelongitudeValue=loc.getLongitude();
  4. locmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,8,newLocationListener()
  5. {
  6. ........
  7. publicvoidonLocationChanged(Locationlocation){
  8. showInfo(location);//当位置信息发生变化时,回调该方法
  9. }
  10. });

四、源码实战 1.功能:(1)实时获取位置的经度与纬度信息;(2)设置指定区域警示:当进入指定范围后提示"您已经进入广州";离开指定范围后提示"您已离开广州"。
2.源码 (1)src/../LocationTest.java a.获取LocationManager位置管理器对象;通过该对象 指定LocationProvider来获取Location对象; b.调用Location中的方法获取Location对象表示的位置信息; c.调用LocationManager的requestLocationUpdates方法实时更新显示的位置信息; d.调用LocationManager的addProximityAlert方法设置靠近警示,并发送一个广播给指定的广播接收器;
  1. packagecom.example.mylocation;
  2. importandroid.app.Activity;
  3. importandroid.app.PendingIntent;
  4. importandroid.content.Context;
  5. importandroid.content.Intent;
  6. importandroid.location.Location;
  7. importandroid.location.LocationListener;
  8. importandroid.location.LocationManager;
  9. importandroid.os.Bundle;
  10. importandroid.widget.TextView;
  11. publicclassLocationTestextendsActivity{
  12. privateTextViewlocation;
  13. privateLocationManagerlocmgr;
  14. privateLocationloc;
  15. protectedvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. location=(TextView)findViewById(R.id.location);
  19. //1.获取LocationManager管理器(对象)
  20. locmgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
  21. //2.使用Locationmanager,通过指定LocationProvider来获取Location对象,表示定位信息;
  22. loc=locmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  23. //3.从Location表示的定位信息中获取定位细节并更新
  24. showInfo(loc);
  25. locmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,8,newLocationListener(){
  26. publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){
  27. }
  28. publicvoidonProviderEnabled(Stringprovider){
  29. }
  30. publicvoidonProviderDisabled(Stringprovider){
  31. }
  32. publicvoidonLocationChanged(Locationlocation){
  33. showInfo(location);//当位置信息发生变化时,回调该方法
  34. }
  35. });
  36. //4.靠近区域警示
  37. doublelatitude=34.232434;
  38. doublelongitude=123.0110223;
  39. intradius=5000;
  40. Intentintent=newIntent("com.jiangdongguo.broadcast");
  41. PendingIntentpi=PendingIntent.getBroadcast(this,-1,intent,0);//发送一个广播到指定接收器
  42. locmgr.addProximityAlert(latitude,longitude,radius,-1,pi);//设置指定范围警告
  43. }
  44. publicvoidshowInfo(Locationloc)
  45. {
  46. Stringerr="未获取到位置信息.";
  47. if(loc!=null)
  48. {
  49. StringBuffersb=newStringBuffer();//可变字符串缓存
  50. sb.append("经度:"+loc.getLongitude()+"\n");
  51. sb.append("纬度:"+loc.getLatitude());
  52. location.setText(sb.toString());
  53. }
  54. else
  55. {
  56. System.out.println(err);
  57. }
  58. }
  59. }
(2)src/.../AlertBroadcast.java 功能:广播接收器子类,用于响应发送过来的广播,并根据intent传过来的信息作出响应。
  1. packagecom.example.mylocation;
  2. importandroid.content.BroadcastReceiver;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.location.LocationManager;
  6. importandroid.widget.Toast;
  7. publicclassAlertBroadcastextendsBroadcastReceiver{
  8. publicvoidonReceive(Contextcontext,Intentintent){
  9. //获取intent传递过来的信息,判断是否进入(默认为false)
  10. Booleanflag=intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING,false);
  11. Stringresult="";
  12. if(flag)
  13. {
  14. result="您已经进入广州!";
  15. }
  16. else
  17. {
  18. result="您已离开广州!";
  19. }
  20. Toast.makeText(context,result,Toast.LENGTH_SHORT).show();
  21. }
  22. }
效果演示
转载请标明出处: http://blog.csdn.net/u012637501

更多相关文章

  1. android GSM+CDMA基站定位--获取移动网络相关信息
  2. GridLayout 使用
  3. 几个比较混淆概念,android中的Info类以及PackageManager和Activit
  4. Android自定义ViewPager(一)——自定义Scroller模拟动画过程
  5. 五大手机操作系统
  6. Android(安卓)Studio 加载 .so库出现couldn't find "*.so"
  7. Android四大组件之一 广播接收者 BroadcastReceiver
  8. 【笔记】Android上ROS开发——android_core创建一个android应用
  9. Android(安卓)WebView和EditText焦点冲突解决

随机推荐

  1. Android BLE ERROR CODE
  2. Snackbar
  3. Drawer实现左右侧滑DrawerLayout
  4. android 获取手机通讯录以及 6.0 授权
  5. android Paint 常量
  6. 《Android系统学习》第八章:Android gtest
  7. 【Android】declare-styleable属性值
  8. Android培训班(36)
  9. Android中跑马灯 maxLines与singleLine
  10. Android中WebView加载本地Html,与JavaScri