转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5715879.html

GPS定位系统由三部分组成,即由GPS卫星组成的空间部分,若干地面组成的控制部分和普通用户手中的接收机这三部分。对于手机用户来说,手机就是GPS定位系统的接收机,也就是说GPS定位需要手机的硬件支持GPS功能。

一、核心API

  Android为GPS功能支持专门提供了一个LocationManager类,

LocationManager lm=(LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);

其常用方法如下:

>  boolean addGpsStatusListener(GpsStatus.Listener listener): 添加一个监听GPS状态的监听器

> void addProximityAlert(double latitude,double  longitude,float radius, long expiration, PendingIntent intent): 添加一个临近警告

> List<String> getAllProviders(): 获取所有的LocationProvider列表

> String getBestProvider(Criteria criteria,boolean enabledOnly): 根据指定条件返回最优的LocationProvider对象

> GpsStatus getGpsStatus(GpsStatus status): 获取GPS状态

> Location getLastKnownLocation(String provider): 根据LocationProvider获取最近一次已知的Location

> LocationProvider getProvider(String name): 根据名称来获取LocationProvider

> List<String>  getProviders(Criteria criteria,boolean enabledOnly): 根据指定条件获取满足该条件的全部LocationProvider的名称

> List<String> getProviders(boolean enabledOnly): 获取所有可用的LocationProvider

> boolean isProviderEnabled(provider): 判断指定名称的LocationProvider是否可用

> void removeGpsStatusListener(GpsStatus.Listener listener): 删除Gps状态监听器

> void removeProximityAlert(PendingIntent intent): 删除一个临近警告

> void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent): 通过指定的LoactionProvider周期性地获取定位信息,并通过intent启动相应的组件。

> void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener): 通过指定的LocationProvider周期性地获取定位信息,并触发listener所对应的触发器。

LocationProvider(定位提供者),LocationProvider对象就是定位组件的抽象表示,通过LocationProvider可以获取该定位组件的相关信息。常用方法如下:

> int getAccuracy(): 返回该LocationProvider的精度

> String getName(): 返回该LocationProvider的名称

> int getPowerRequirement(): 获取该LocationProvider的电源需求

> boolean hasMonetaryCost(): 获取该LocationProvider是收费的还是免费的

> boolean meetsCriteria(Criteria criteria) : 判断该LocationProvider是否满足Criteria条件

> boolean requiresCell(): 判断该LocationProvider是否需要访问网络基站

> boolean requiresNetwork(): 判断该LocationProvider是否需要网络数据

> boolean requiresSatellite(): 判断该LocationProvider是否需要访问基于卫星的定位系统

> boolean supportsAltitude(): 判断该LocationProvider是否支持高度信息

> boolean supportsBearing(): 判断该LocationProvider是否支持方向信息

> boolean supportsSpeed(): 判断该LocationProvider是否支持速度信息

Location,一个代表位置信息的抽象类,提供如下方法来获取定位信息

> float getAccuracy(): 获取定位信息的精度

> double getAltitude(): 获取定位信息的高度

> float getBearing(): 获取定位信息的方向

> getLatitude(): 获取定位信息的纬度

> getLongitude(): 获取定位信息的经度

> getProvider(): 获取提供该定位信息的LocationProvider

> getSpeed(): 获取定位信息的速度

> hasAccuracy(): 判断该定位信息是否有精度信息

> hasAltitude(): 判断该定位信息是否有高度信息

> hasBearing(): 判断该定位信息是否有方向信息

> hasSpeed(): 判断该定位信息是否有速度信息

  这三个API是Android GPS支持的三个核心API,用它们来获取GPS定位信息的通过步骤为:

(1) 获取系统的LocationManager对象

(2) 使用LocationManager,通过指定LocationProvider来获取定位信息,定位信息由Location对象来表示

(3) 从Location中获取定位信息

二、获取LocationProvider

  Android的定位信息由LocationProvider对象来提供,该对象代表一个抽象的定位组件。在编程之前需要先获取LocationProvider对象。

1. 示例:获取所有可用的LocationProvider

public class AllProvidersActivity extends Activity {
    ListView providers;
    LocationManager lm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_providers);

        providers=(ListView) findViewById(R.id.providers);
        lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        List<String> providerNames=lm.getAllProviders();
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, providerNames);
        providers.setAdapter(adapter);

    }
}

如图可看出当前模拟器所有可用的LocationProvider有三个:

> passive: 由LocationManager.PASSIVE_PROVIDER常量表示

> gps: 由LocationManager.GPS_PROVIDER常量表示,代表通过GPS获取定位信息的LocationProvider对象

> network: 由LocationManager.NETWORK_PROVIDER常量表示,代表通过移动通信网络获取定位信息的LocationProvider对象

2. 通过名称获得指定LocationProvider

//获得基于GPS的LocationProvider
LocationProvider gpsProvider=lm.getProvider(LocationManager.GPS_PROVIDER);

3. 根据Criteria获取LocationProvider

LocationManager的getBestProvider(Criteria criteria,boolean enabledOnly)用来得到符合指定条件的LocationProvider。Criteria代表了一个过滤条件,提供如下常用方法来设置:

> setAccuracy(int accuracy): 设置对LocationProvider的精度要求

> setAltitudeRequired(boolean altitudeRequired): 设置要求LocationProvider能提供高度信息

> setBearingRequired(boolean bearingRequired): 设置要求LocationProvider能提供方向信息

> setCostAllowed(boolean  costAllowed): 设置要求LocationProvider是否免费

> setPowerRequirement(int level): 设置要求LocationProvider的耗电量

> setSpeedRequired(boolean speedRequired): 设置要求LocationProvider能提供速度信息

示例:获取系统中免费的、能提供高度信息、速度信息的LocationProvider

public class AllProvidersActivity extends Activity {
    ListView providers;
    LocationManager lm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_providers);
        providers=(ListView) findViewById(R.id.providers);
        lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria cri=new Criteria();
        cri.setCostAllowed(false);
        cri.setAltitudeRequired(true);
        cri.setBearingRequired(true);
        List<String> providerNames=lm.getAllProviders();
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, providerNames);
        providers.setAdapter(adapter);
    }
}

三、获取定位信息

示例:通过手机实时获取定位信息,包括用户所在的经度、纬度、高度、方向、移动速度等

public class LocationActivity extends Activity {
    LocationManager lm;
    EditText show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        show=(EditText) findViewById(R.id.show);
        lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //从GPS获取最近的定位信息
        Location location=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Log.i("LocationActivity", "location="+location);
        updateView(location);
        //每3秒获取一次GPS的定位信息
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 8, new LocationListener() {

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {
                // 当GPS LocationProvider可用时,更新位置
                updateView(lm.getLastKnownLocation(provider));
            }

            @Override
            public void onProviderDisabled(String provider) {
                updateView(lm.getLastKnownLocation(null));
            }

            @Override
            public void onLocationChanged(Location location) {
                //GPS定位信息发生改变时,更新位置
                updateView(location);
            }
        });
    }

    public void updateView(Location newLocation){
        if(newLocation!=null){
            StringBuilder sb=new StringBuilder();
            sb.append("实时的位置信息:\n");
            sb.append("经度:");
            sb.append(newLocation.getLongitude());
            sb.append("\n纬度:");
            sb.append(newLocation.getLatitude());
            sb.append("\n高度:");
            sb.append(newLocation.getAltitude());
            sb.append("\n速度:");
            sb.append(newLocation.getSpeed());
            sb.append("\n方向:");
            sb.append(newLocation.getBearing());
            show.setText(sb.toString());
        }else{
            show.setText("");
        }
    }
}

个人总结:

1. 因为GPS信号偶尔会不好,所以仅使用gps的时候,绝大多数情况下会出现getLastKnowLocation为null,需要在系统的定位模式中,要允许使用wifi和network定位;这样即使gps定位返回null,network也能得到粗略的位置信息。

2. getLastKnownLocation经常取不到东西的,使用百度定位SDK吧,比较靠谱。

3. getLastKnowLocation不是一次就能定位成功,必须要多次定位。

4. 要在空旷无遮挡物的地方。

四、临近警告

  LocationManager提供一个方法addProximityAlert(double latitude,double  longitude,float radius, long expiration, PendingIntent intent)用于添加一个临近警告。当用户手机不断临近指定固定点时,当与该固定点的距离小于指定范围时,系统可以触发相应的处理。

示例:

public class ProximityTestActivity extends Activity {
    LocationManager lm;
    double longitude=113.39;
    double latitude=23.13;
    float radius=5000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proximity_test);
        lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Intent intent=new Intent(this,ProximityAlertReceiver.class);
        PendingIntent pi=PendingIntent.getBroadcast(this, -1, intent, 0);
        //第四个参数指定经过多少毫秒后该临近警告就会过期失效,-1指定永不过期
        lm.addProximityAlert(latitude, longitude, radius, -1, pi);
    }

    public class ProximityAlertReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            boolean isEnter=intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
            if(isEnter){
                Toast.makeText(context, "你已进入禁止区域", 0).show();
            }else{
                Toast.makeText(context, "你离开禁止区域", 0).show();
            }
        }
    }
}

 

Android GPS应用开发的更多相关文章

  1. android gps开发必备资料(含测试demo下载)

    入门资料参考: How accurate is Android GPS? Part 1: Understanding Location Data How accurate is Android GPS ...

  2. Basic4android:多功能的Android应用软件快速开发平台

    Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...

  3. Android 实践项目开发 总结

      Android 实践项目开发 总结 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________       指导老师:娄嘉鹏       ...

  4. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  5. (android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图

    (android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图 http://www.cnblogs.com/macroxu-1982/archive/2011/09/13 ...

  6. 彻底解决Android GPS没法定位这一顽固问题

    大家去网上搜索Android定位location为null没法定位问题.预计有一大堆文章介绍怎样来解决.可是最后大家发现基本没用. 本文将从Android定位实现原理来深入分析没法定位原因并提出真正的 ...

  7. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  8. [转]Android样式的开发:shape篇

    转载自Keegan小钢原文链接:http://keeganlee.me/post/android/20150830 Android样式的开发:shape篇Android样式的开发:selector篇A ...

  9. Android之NDK开发(转)

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

随机推荐

  1. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  2. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  3. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  4. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  5. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...

  6. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  7. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

  8. Javascript实用方法二

    承接上一篇, Object keys object的keys方法能够获取一个给定对象的所有键(key/属性名)并以数组的形式返回.这个方法可以用于键的筛选.匹配等. var basket = { st ...

  9. pt-pmp

    pt-pmp有两方面的作用:一是获取进程的堆栈信息,二是对这些堆栈信息进行汇总. 进程的堆栈信息是利用gdb获取的,所以在获取的过程中,会对mysql服务端的性能有一定的影响. 用官方的话说: Thi ...

  10. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...