Android之基于位置的服务

来源:互联网 发布:蛙5火箭知乎 编辑:程序博客网 时间:2024/05/16 10:46

  由于移动设备相比于电脑可以随身携带,我们通过地理定位的技术就可以随时得知自己所在的位置,从而围绕这一点开发出很多有意思的应用。

       基于位置的服务简称LBS,这个技术随着移动互联网的兴起,在最近的几年里十分火爆。 其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动设备所在的位置,而这种定位技术早在很多年前就已经出现了。

       那为什么 LBS 技术直到最近几年才开始流行呢?这主要是因为,在过去移动设备的功 能极其有限,即使定位到了设备所在的位置,也就仅仅只是定位到了而已,我们并不能在位 置的基础上进行一些其他的操作。而现在就大大不同了,有了 Android 系统作为载体,我们 可以利用定位出的位置进行许多丰富多彩的操作。比如说天气预报程序可以根据用户所在的 位置自动选择城市,发微博的时候我们可以向朋友们晒一下自己在哪里,不认识路的时候随 时打开地图就可以查询路线,等等等等。

 

——位置提供者

       选择一个位置提供器来确定设备当前的位置。Android 中一般有三种位置提供器可供选择,GPS_PROVIDER、NETWORK_PROVIDER 和 PASSIVE_PROVIDER。

——GPS_PROVIDER(基于GPS的位置提供者)

               GPS定位系统由三部分组成,GPS卫星组成的空间部分,若干地面站组成的控制部分和用户手中的接收机

               GPS的空间部分由GPS卫星组成,覆盖了全球上空的GPS卫星星座,共24颗卫星,必须保证在各处能时时观测到4颗卫星,这样才能保证GPS系统的准确定位。

               GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。

       

——NETWORK_PROVIDER(基于网络的位置提供者)

              1.WIFI定位:其原理是首先收集每个WIFI无线接入点的位置,对每个无线路由器进行唯一的标识,在数据库中注明这些接入点的具体位置。 使用时,一旦发现有WI-FI接入点,则进入到数据中查看匹配的记录,进而得到位置信息。

               2.基站定位:  此类位置的获取有赖于手机无线通讯信号,当手机处在信号覆盖范围内,手机可以获得该区域(即通讯术语中的“小区”)的识别号。因为这些识别号是惟一的,因此可以将识别号和地理坐标对应起来,因此根据识别号就可以知道地理位置。但是误差比较大。

           

——PASSIVE_PROVIDER(被动位置提供者)


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

 LocationManager locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);

——LocationProvider:提供定位功能的组件集合

——Criteria:代表一个过滤的条件

Criteria criteria = new Criteria();

// //设置定位精确度Criteria

criteria.setAccuracy(Criteria.ACCURACY_FINE);

// //设置是否需要海拔信息

criteria.setAltitudeRequired(false);

// //设置是否需要方位信息

criteria.setBearingRequired(false);

// //设置是否允许运营商收费

criteria.setCostAllowed(true);

// //设置对电源的要求

criteria.setPowerRequirement(Criteria.POWER_LOW);

final String bestProvider =lm.getBestProvider(criteria,true);

 

——LocationListener

       onStatusChanged:  在用户禁用具有定位功能的硬件时被调用

       onProviderEnabled:在用户启动具有定位功能的硬件是被调用

   onProviderDisabled:在提供定位功能的硬件状态改变是被调用

      onLocationChanged:在设备的位置改变时被调用

写一个简单的例子,来获取所有的LocalProvider

代码如下:

public class MainActivity extends Activity {private LocationManager mLocationManager;private ListView list;private Criteria mCriteria;String bestProvider;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list=(ListView) findViewById(R.id.list);mCriteria=new Criteria();//设置定位精度CriteriamCriteria.setAccuracy(Criteria.ACCURACY_FINE);//设置是否需要海拔信息mCriteria.setCostAllowed(true);//设置是否需要方位信息mCriteria.setBearingRequired(true);//设置是否允许运营商收费mCriteria.setCostAllowed(false);//设置对电源的要求//mCriteria.setPowerRequirement(Criteria.POWER_LOW);mLocationManager=(LocationManager) getSystemService(LOCATION_SERVICE);//获取所有的位置提供者//List<String>lists=mLocationManager.getAllProviders();List<String>lists=mLocationManager.getProviders(mCriteria, false);ArrayAdapter<String>adapter=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,lists);list.setAdapter(adapter);}}

布局文件就一个listview,我就不贴代码了~

注意:要加权限

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


0 0
原创粉丝点击