当前位置:操作系统 > 安卓/Android >>

Android定位功能(二)

在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息。但是前文是基于Criteria定制了一个标准,通过getBestProvider()方法由Android系统自动获取最符合Criteria的LocationProvider,从而实现了定位功能。这样的做法能最大限度的保证定位功能的可实现性,但是却无法保证获取到的位置信息有最大的准确度。因为除了GPS外,其他定位方式都或多或少存在着位置偏移。

  在实现GPS定位前,先了解一下GPS的部分特性:

  1. GPS定位需要依靠3颗或3颗以上的卫星。

  2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。

  3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。

  在Android系统中,实现GPS定位的思路应该是:

  1. 获取GPS的Location Provider。

  2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。

  3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次易做图,检测卫星状态。(可选步骤)

  根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态) 


  1 public class MainActivity extends Activity { 
2  private LocationManager locationManager; 
3   private GpsStatus gpsstatus; 
4     @Override 
5     public void onCreate(Bundle savedInstanceState) {
  6        super.onCreate(savedInstanceState); 
7        setContentView(R.layout.main); 
8          9        //获取到LocationManager对象
10        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
11       
  12        //根据设置的Criteria对象,获取最符合此标准的provider对象
13        String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
14    
     15        //根据当前provider对象获取最后一次位置信息
16        Location currentLocation = locationManager.getLastKnownLocation(currentProvider);
17        //如果位置信息为null,则请求更新位置信息
18        if(currentLocation == null){
19            locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);
20        } 21        //增加GPS状态易做图
22        locationManager.addGpsStatusListener(gpsListener);
23       
  24        //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度
25        //每隔10秒获取一次位置信息
26        while(true){
27            currentLocation = locationManager.getLastKnownLocation(currentProvider);
28            if(currentLocation != null){
29                Log.d("Location", "Latitude: " + currentLocation.getLatitude());
30                Log.d("Location", "location: " + currentLocation.getLongitude());
31                break;
32            }else{
33                Log.d("Location", "Latitude: " + 0);
34                Log.d("Location", "location: " + 0);
35            }
36            try {
37                Thread.sleep(10000);
38            } catch (InterruptedException e) {
39                 Log.e("Location", e.getMessage());
40            }
41        }
42     }
43     
44     private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){
45         //GPS状态发生变化时触发
46         @Override
47         public void onGpsStatusChanged(int event) {
48             //获取当前状态
49             gpsstatus=locationManager.getGpsStatus(null);
50             switch(event){
51                 //第一次定位时的事件
52                 case GpsStatus.GPS_EVENT_FIRST_FIX:
53                     break;
54                 //开始定位的事件
55                 case GpsStatus.GPS_EVENT_STARTED:
56                     break;
57                 //发送GPS卫星状态事件
58                 case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
59                     Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show();
60                     Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites();   
61                     Iterator<GpsSatellite> it=allSatellites.iterator(); 
62                     int count = 0;
63                     while(it.hasNext()) 
   64      

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,