博客原始地址:wisekingokok.cnblogs.com 
在前文 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功能模块处于打开状态)  public class MainActivity extends Activity {
         private LocationManager locationManager;
         private GpsStatus gpsstatus;
         @Override
         public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                
                 //获取到LocationManager对象
                locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                
                 //根据设置的Criteria对象,获取最符合此标准的provider对象
                String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
                
                 //根据当前provider对象获取最后一次位置信息
                Location currentLocation = locationManager.getLastKnownLocation(currentProvider);
                 //如果位置信息为null,则请求更新位置信息
                 if(currentLocation == null){
                        locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);
                }
                 //增加GPS状态监听器
                locationManager.addGpsStatusListener(gpsListener);
                
                 //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度
                 //每隔10秒获取一次位置信息
                 while( true){
                        currentLocation = locationManager.getLastKnownLocation(currentProvider);
                         if(currentLocation != null){
                                Log.d( "Location", "Latitude: " + currentLocation.getLatitude());
                                Log.d( "Location", "location: " + currentLocation.getLongitude());
                                 break;
                        } else{
                                Log.d( "Location", "Latitude: " + 0);
                                Log.d( "Location", "location: " + 0);
                        }
                         try {
                                Thread.sleep(10000);
                        } catch (InterruptedException e) {
                                 Log.e( "Location", e.getMessage());
                        }
                }
         }
        
         private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){
                 //GPS状态发生变化时触发
                 @Override
                 public void onGpsStatusChanged( int event) {
                         //获取当前状态
                         gpsstatus=locationManager.getGpsStatus( null);
                         switch(event){
                                 //第一次定位时的事件
                                 case GpsStatus.GPS_EVENT_FIRST_FIX:
                                         break;
                                 //开始定位的事件
                                 case GpsStatus.GPS_EVENT_STARTED:
                                         break;
                                 //发送GPS卫星状态事件
                                 case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                                         Toast.makeText(MainActivity. this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show();
                                         Iterable allSatellites = gpsstatus.getSatellites();    
                                         Iterator it=allSatellites.iterator();
                                         int count = 0;
                                         while(it.hasNext())    
                                         {    
                                                 count++;
                                         }
                                         Toast.makeText(MainActivity. this, "Satellite Count:" + count, Toast.LENGTH_SHORT).show();
                                         break;
                                 //停止定位事件
                                 case GpsStatus.GPS_EVENT_STOPPED:
                                         Log.d( "Location", "GPS_EVENT_STOPPED");
                                         break;
                         }
                 }
         };
        
        
         //创建位置监听器
         private LocationListener locationListener = new LocationListener(){
                 //位置发生改变时调用
                 @Override
                 public void onLocationChanged(Location location) {
                         Log.d( "Location", "onLocationChanged");
                 }

                 //provider失效时调用
                 @Override
                 public void onProviderDisabled(String provider) {
                         Log.d( "Location", "onProviderDisabled");
                 }

                 //provider启用时调用
                 @Override
                 public void onProviderEnabled(String provider) {
                         Log.d( "Location", "onProviderEnabled");
                 }

                 //状态改变时调用
                 @Override
                 public void onStatusChanged(String provider, int status, Bundle extras) {
                         Log.d( "Location", "onStatusChanged");
                 }
         };
} 通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。   另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。

更多相关文章

  1. Android(安卓)获取屏幕高度、标题高度、状态栏高度详解
  2. Android学习笔记(9)——ListView简介
  3. 工作总结|Android(安卓)自定义列表刷新控件
  4. android selector android:state_enabled 无效
  5. Activity的生命周期,状态保存,窗口显示,取得返回结果,安全退出
  6. Android(安卓)TV横向滚动网格布局——RecyclerView的使用
  7. 第17天 Android(安卓)Touch事件学习 4 获取手指触摸位置
  8. Android(安卓)Wifi模块学习
  9. android 处理生命周期事件

随机推荐

  1. json形式的 Android(安卓)客户端与服务器
  2. Android的状态机模式StateMachine与State
  3. Android学习笔记-Android非布局activity
  4. android multicast 多播(组播)问题
  5. 2.1……Android中的单位简介
  6. Android(安卓)ListView pull up to refre
  7. android studio开发工具升级到3.6.0以后,a
  8. android正则表达式匹配中文正解
  9. Android Gradle 初识
  10. android camera以时间来命名照片文件