基本介绍
基于位置的服务(LBS)是一个宽泛的概念,它描述了用来查找设备当前位置的不同技术,其中有两个比较重要的(LBS)元素是:
1)LocationManger:提供基于位置服务的挂钩(hook)
2)LocationProvider:每一个provider都表示不同的位置查找技术,该技术用来确定设备当前位置。
使用LocationManager可以获得当前的位置、追踪移动、设置在检测到进度或者离开一个指定区域时的邻近提醒。
在进行代码之前首先应该了解位置服务的基本方法及其一些常用的属性,其中可以通过如下语句取得LocationManager(位置管理器)对象:
LocationManager manager = null ; managger = (LocationManager).getSystemService(Context.LOCATION_SERVICE); |
在获取LocationManager的服务之后就可以通过LocationManager的对象来获得LocationProvider(位置提供者)
//获得一个指定的提供者的 LocationProvider provider = null; Provider = manager.getProvider(LocationManager.GPS_PROVIDER); |
如果要获得所有在设备上可用的提供器的列表,可以调用getProviders(),并使用一个boolean值来说明希望返回所有的提供器,还是说只返回已经启用的.
List<String> providers = manager.gerProviders(true); |
LocationManager还为位置更新提供了如下方法:
void android.location.LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) |
其中provider指的是LocationProvider(位置提供都)的对象,minTime指的是更新的时间(毫秒),minDistance指的是更新的距离(米),listener指的是监听器,实现这个监听器还需要实现以下几个方法:
//位置改变时触发实现此方法 public void onLocationChanged(Location location) {} |
//提供者不可用时实现触发此方法 public void onProviderDisabled(String provider) {} |
//提供者可用时触发此方法 public void onProviderEnabled(String provider) {} |
//状态改变时触发此方法 public void onStatusChanged(String provider, int status, Bundle extras) {} |
LocationManager为获取当前位置提供的另一个方法就是
//取得最后一个确定的位置 Location android.location.LocationManager.getLastKnownLocation(String provider) |
另外由于涉及到一些权限,因此需要在AndroidMainfest.xml文件中添加如下权限:
<!-- GPS provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Network provide的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> |
在了解完位置服务常用的类及相应的属性后,接下来就用一个Demo来讲解一下,如何取得当前的位置信息。
案例一:通过指定的提供器来获得当前的位置信息
1)首先在main.xml文件中添加一个用来显示当前位置信息的TextView,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="位置信息.." />
</LinearLayout>
|
2)在一个继承了Activity类的MainActivity.java类中取得相应的组件及位置管理器的服务和位置提供者的对象,具体实现代码如下:
package zjh.android.lx;
import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView;
public class MainActivity extends Activity implements LocationListener{ private TextView info = null; private LocationManager manager = null; double latitude,longitude; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); //取得相应的组件id this.info = (TextView)super.findViewById(R.id.info); //获取位置管理器的服务 this.manager = (LocationManager)super.getSystemService(Context.LOCATION_SERVICE); //请求位置更新 this.manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,this);
}
@Override public void onLocationChanged(Location location) { latitude = location.getLatitude(); longitude = location.getLongitude(); MainActivity.this.info.setText("经度="+latitude+"纬度="+longitude); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} }
|
3)在AndroidMainfest.xml文件中添加如下权限:
<!-- GPS provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> |