zoukankan      html  css  js  c++  java
  • 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 publicclass MainActivity extends Activity {
      2 private LocationManager locationManager;
      3 private GpsStatus gpsstatus;
      4     @Override
      5 publicvoid 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 publicvoid 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                     {   
     65                         count++;
     66                     }
     67                     Toast.makeText(MainActivity.this, "Satellite Count:"+ count, Toast.LENGTH_SHORT).show();
     68 break;
     69 //停止定位事件 70 case GpsStatus.GPS_EVENT_STOPPED:
     71                     Log.d("Location", "GPS_EVENT_STOPPED");
     72 break;
     73             }
     74         }
     75     };
     76  77  78 //创建位置监听器 79 private LocationListener locationListener =new LocationListener(){
     80 //位置发生改变时调用 81         @Override
     82 publicvoid onLocationChanged(Location location) {
     83             Log.d("Location", "onLocationChanged");
     84         }
     85  86 //provider失效时调用 87         @Override
     88 publicvoid onProviderDisabled(String provider) {
     89             Log.d("Location", "onProviderDisabled");
     90         }
     91  92 //provider启用时调用 93         @Override
     94 publicvoid onProviderEnabled(String provider) {
     95             Log.d("Location", "onProviderEnabled");
     96         }
     97  98 //状态改变时调用 99         @Override
    100 publicvoid onStatusChanged(String provider, int status, Bundle extras) {
    101             Log.d("Location", "onStatusChanged");
    102         }
    103     };
    104 }
    复制代码

      通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。

      另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。

      本人暂时未找到同时关闭网络和GPS功能实现定位的方法,本人也未找到通过代码在没有ROOT的前提下直接代开网络和GPS功能的代码。如果大家在这两方面有自己的体会,请不吝赐教,留言评论或给出参考地址都可。大家一同探讨,一同进步。

  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/LiaoHao/p/3298558.html
Copyright © 2011-2022 走看看