博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android定位功能(二)
阅读量:6813 次
发布时间:2019-06-26

本文共 4298 字,大约阅读时间需要 14 分钟。

hot3.png

在实现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添加次监听器,检测卫星状态。(可选步骤)

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实现定位功能。

转载于:https://my.oschina.net/guoqiantong/blog/114325

你可能感兴趣的文章
【Cocos2d-Js基础教学(3)各种基类的定义和使用】
查看>>
java.util.logging.Logger使用详解
查看>>
Sql Server -更新语句,修改的字段是日期时间型,修改其中的月份
查看>>
C#控件一览表
查看>>
【转】linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解----不错...
查看>>
Vertica增加一个数据存储的目录
查看>>
小小的告别一下这个博客
查看>>
【转】内核编译时, 到底用make clean, make mrproper还是make distclean(转载)
查看>>
The YubiKey NEO
查看>>
看一下你在中国属于哪个阶层?
查看>>
Collections.sort方法对list排序的两种方式
查看>>
Synchronize Ultimate
查看>>
设计模式之模板方法模式
查看>>
关于配置
查看>>
如何更好的通过Inflate layout的方式来实现自定义view
查看>>
js 加载初始化日期
查看>>
smali语法中文版
查看>>
快如闪电、超轻量级的基于.Net平台的依赖注入框架Ninject
查看>>
Effective C++ -- 继承和面向对象设计
查看>>
在信息技术和加密算法
查看>>