Android笔记三十二.Android位置服务及核心API

一、位置服务概念
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 String getBestProvider(Criteria criteria,boolean enabledOnly):根据指定条件返回最优的LocationProvider。其中criteria表示过滤条件,enabledOnly表示是否要求处于启用状态。  
 public Location getLastKnowLocation(String provider):根据LocationProvider获取最近一次已经的Location对象。其中provider表示提供上次位置的LocationProvider名称。
 public LocationProvider getProvider(String name):根据名称返回LocationProvider对象。
 public List<String> getProviders(boolean enabledOnly):获取所有可用的LocationProvaider。
 public voidrequestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener):通过指定的LocationProvider周期性地获取定位信息,并触发listener所对应的触发器。
 public void addProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent):添加一个临近警告。即不断监听手机的位置,当手机与固定点的距离小于指定范围时,系统将会触发相应事件,进行处理。其中,latitude指定中心点的经度,longitude指定中心点的纬度,指定一个半径长度,expiration指定经过多少毫秒后该临近警告就会过期失效(-1指定永不过期),intent指定临近该固定点时触发该intent对应的组件。
 public void requestLocationUpdates(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中的常用方法
int getAccuracy():返回该LocationProvider的精度;
int getPowerRequirement():返回LocationProvider对电量的要求;
String getName():返回该LocationProvider的名称;
boolean hasMonetaryCost():判断该LocationProvider是否支持方向信息;
boolean supportsSpeed():判断该LocationProvider是否支持速度信息。
3.Location类
功能:该类代表位置信息的抽象类,通过Location可获取定位信息的精度、高度、方向、纬度、经度、速度以及改位置的LocationProvider等信息。
4.LocationListener接口
(1)功能
    该接口用于监听定位信息的监听器,必须在定位管理器中注册该对象,这样在位置发生变化的时候就会触发相应的方法进行事件处理。
(2)常用方法
public abstract void onLacationChanged(Location location):位置发生改变时回调该方法;
public abstract void onProviderDisabled(String provider):Provider禁止时回调该方法;
public abstract void onProviderEnabled(String provider):Provider启动时回调该方法;
public abstract void onStatusChanged(String provider,int status,Bundle extras):当Provider状态发生变化时回调该方法。

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

四、源码实战
1.功能:(1)实时获取位置的经度与纬度信息;(2)设置指定区域警示:当进入指定范围后提示"您已经进入广州";离开指定范围后提示"您已离开广州"。
技术分享
技术分享
2.源码
(1)src/../LocationTest.java
    a.获取LocationManager位置管理器对象;通过该对象指定LocationProvider来获取Location对象;
    b.调用Location中的方法获取Location对象表示的位置信息;
    c.调用LocationManager的requestLocationUpdates方法实时更新显示的位置信息;
    d.调用LocationManager的addProximityAlert方法设置靠近警示,并发送一个广播给指定的广播接收器;
  1. package com.example.mylocation;    
  2. import android.app.Activity;   
  3. import android.app.PendingIntent;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.location.Location;  
  7. import android.location.LocationListener;  
  8. import android.location.LocationManager;  
  9. import android.os.Bundle;  
  10. import android.widget.TextView;  
  11. public class LocationTest extends Activity {  
  12.  private TextView location;  
  13.  private LocationManager locmgr;  
  14.  private Location loc;  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  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, 10008new LocationListener() {  
  26.    public void onStatusChanged(String provider, int status, Bundle extras) {  
  27.    }  
  28.    public void onProviderEnabled(String provider) {  
  29.    }  
  30.    public void onProviderDisabled(String provider) {  
  31.    }  
  32.    public void onLocationChanged(Location location) {  
  33.     showInfo( location);    //当位置信息发生变化时,回调该方法  
  34.    }  
  35.   });  
  36.         //4.靠近区域警示  
  37.         double latitude=34.232434;  
  38.         double longitude=123.0110223;  
  39.         int radius=5000;  
  40.         Intent intent=new Intent("com.jiangdongguo.broadcast");  
  41.         PendingIntent pi = PendingIntent.getBroadcast(this, -1, intent, 0); //发送一个广播到指定接收器  
  42.         locmgr.addProximityAlert(latitude, longitude, radius, -1, pi);         //设置指定范围警告  
  43.     }  
  44.      
  45.     public void showInfo(Location loc)  
  46.     {  
  47.      String err="未获取到位置信息.";  
  48.      if(loc!=null)  
  49.      {  
  50.       StringBuffer sb = new StringBuffer();  //可变字符串缓存  
  51.       sb.append("经度:"+loc.getLongitude()+"\n");  
  52.       sb.append("纬度:"+loc.getLatitude());  
  53.       location.setText(sb.toString());  
  54.      }  
  55.      else  
  56.      {  
  57.       System.out.println(err);  
  58.      }  
  59.     }  
  60. }
(2)src/.../AlertBroadcast.java
功能:广播接收器子类,用于响应发送过来的广播,并根据intent传过来的信息作出响应。
  1. package com.example.mylocation;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.location.LocationManager;  
  6. import android.widget.Toast;  
  7. public class AlertBroadcast extends BroadcastReceiver {  
  8.  public void onReceive(Context context, Intent intent) {  
  9.    //获取intent传递过来的信息,判断是否进入(默认为false)  
  10.    Boolean flag = intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);  
  11.    String result="";  
  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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。