基于位置的服务简称LBS(Location Based Service)



基于位置的服务简称LBS,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置。


归根结底,其实基于位置的服务所围绕的核心就是要确定出自己所在的位置,这在Android中并不困难,主要借助LocationManager这个类就实现了。



LocationManager的基本用法:


package com.example.locationservice;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * 获取LocationManager实例对象。getSystemService()方法接收一个字符串参数用于确定获取系统的那个服务,
		 * 这里传入Context.LOCATION_SERVICE即可。
		 * *Android中一般有三种位置提供器可供选择,GPS_PROVIDER、NETWORK_PROVIDER和PASSIVE_PROVIDER。
		 * 其中前两种使用的比较多,分别表示使用GPS定位和使用网络定位。
		 * GPS定位的精确度比较高,但是非常耗电。
		 * 网络定位的精确度稍差,但耗电量比较少。
		 */
		//1.获取LocationManager实例对象
		LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		//2.获取位置提供器
		String provider = LocationManager.NETWORK_PROVIDER;
		//3.将选择好的位置提供器传入到getLastKnownLocation()方法中,就可以得到一个Location对象
		/**Location对象中包含了经度,纬度,海拔等一系列的位置信息*/
		Location location = locationManager.getLastKnownLocation(provider);
	}
}

如果有些时候你想让定位的精度尽量高一些,但又不确定GPS定位的功能是否已经启用,这个时候就可以先判断一下有哪些位置提供器可用。


/**
 * getProviders()方法接收一个布尔型参数,传入true就表示只有启用的位置提供器才会被返回。
 * 之后再从providerList中判断是否包含GPS定位的功能就行了。
 */
List<String> providerList = locationManager.getProviders(true);



另外,调用getLastKnownLocation();方法虽然可以获取到设备当前的位置信息,但是用户是完全有可能带着移动设备随时移动的,那么我们怎样才能在设备位置发生变化的时候获取到最新的位置信息呢?不用担心,LocationManager还提供了一个requestLocationUpdates()方法,只要传入一个LocationListener的实例。



/**
  * 这里requestLocationUpdates()方法接收四个参数
  * String provider:	位置提供器的类型
  * long minTime:	监听位置变化的时间间隔,以毫秒为单位
  * float minDistance:	监听位置变化的距离间隔,以米为单位
  * LocationListener listener:	LocationListener监听器
  * 
  * 这样,LocationManager每隔5秒钟会检测一下位置的变化情况,当移动距离超过10米的时候,
  * 就会调用LocationListener的onLocationChanaged()方法,并把新的位置信息作为参数传入。
  */
	locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			
		}
			
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
				
		}
			
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
				
		}
			
		@Override
		public void onLocationChanged(Location location) {
			// TODO Auto-generated method stub
				
		}
	});

确定自己位置的经纬度:



activity_main.xml



<RelativeLayout 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" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="我的位置坐标:"
        android:textSize="18sp"
        android:id="@+id/tv_location"
        android:textColor="#f00" />

</RelativeLayout>

MainActivity.java



package com.example.locationservice;

import java.util.List;

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;
import android.widget.Toast;

public class MainActivity extends Activity {

	private TextView tvLocation;
	private String provider;
	private LocationManager locationManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tvLocation = (TextView) findViewById(R.id.tv_location);
		//1.获取LocationManager对象
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		//2.获取所有可用的位置提供器
		List<String> allProviders = locationManager.getAllProviders();
		if(allProviders.contains(LocationManager.GPS_PROVIDER)){
			provider = LocationManager.GPS_PROVIDER;
		}else if(allProviders.contains(LocationManager.NETWORK_PROVIDER)){
			provider = LocationManager.NETWORK_PROVIDER;
		}else{
			//当没有可用的位置提供器时,弹出Toast提示用户
			Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
		}
		//3.获取到记录当前位置信息的Location对象了
		Location location = locationManager.getLastKnownLocation(provider);
		if(location!=null){
			//显示当前设备的位置信息
			showLocation(location);
		}
		//4.为了监测到位置信息的变化
		locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(locationManager!=null){
			//关闭程序时将监听器移除,保证不会继续耗费手机的电量
			locationManager.removeUpdates(locationListener);
		}
	}
	LocationListener locationListener = new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onLocationChanged(Location location) {
			// 更新当前设备的位置信息
			showLocation(location);
			
		}
	};
	/**显示位置信息*/
	private void showLocation(Location location) {
		String j = "经度:"+location.getLongitude();
		String w = "维度:"+location.getLatitude();
		String accuracy = "精确度:"+location.getAccuracy();
		String altitude = "海拔" + location.getAltitude();
		tvLocation.setText(j+"\n"+w+"\n"+accuracy+"\n"+altitude);
	}
}

在清单文件中加入权限:



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




首先看一下手机定位都有哪些方式:




android 定位仅限使用期间_ide



1.网络定位


根据ip地址定位,ip地址和实际地址形成一个数据库,可以根据ip在数据库中查出具体地址。


缺点:ip地址动态分配,会导致定位不准确


2.基站定位


范围:几百米到几公里不等,范围比较广。


3.GPS定位


至少需要3颗卫星,GPS使用24颗卫星,基本可以覆盖全球90%的区域。


范围:几米到几十米不等


缺点:容易受云层,建筑等干扰。


4.A-GPS,辅助GPS定位系统


通过网络和GPS共同定位,一般Android手机都采用此种定位方式。


范围:几米到几十米不等。