转载请注明出处: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. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  2. 在传统.NET Framework 上运行ASP.NET Core项目

    新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...

  3. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  4. spring源码分析之context

    重点类: 1.ApplicationContext是核心接口,它为一个应用提供了环境配置.当应用在运行时ApplicationContext是只读的,但你可以在该接口的实现中来支持reload功能. ...

  5. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  6. arcgis api for js入门开发系列五地图态势标绘(含源代码)

    上一篇实现了demo的地图查询功能,本篇新增地图态势标绘模块,截图如下: 本篇核心的在于调用API的Draw工具:https://developers.arcgis.com/javascript/3/ ...

  7. 打破陈规抓痛点,H3 BPM10.0挑战不可能

    高效益意味着相似的运营活动比竞争对手做得更好,而战略定位则意味着企业在运营活动中有区别于竞争对手的实施方式,即差异化竞争.在新经济体下,面对社会的变革.市场的竞争环境.不断攀升的成本压力,几乎没有企业 ...

  8. JQuery阻止事件冒泡

    冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 我们在平时的开发过程中,肯定会遇到在一个div(这个div可以是元素)包裹一个div的情况,但是呢,在这两个div上都添加了事件,如果点 ...

  9. 【Update】C# 批量插入数据 SqlBulkCopy

    SqlBulkCopy的原理就是通过在客户端把数据都缓存在table中,然后利用SqlBulkCopy一次性把table中的数据插入到数据库中. SqlConnection sqlConn = new ...

  10. Linux网络属性配置

    目录 IP地址分类 如何将Linux主机接入到网络中 网络接口的命名方式 ifcfg系列命令 如何配置主机名 如何配置DNS服务器指向 iproute2系列命令 Linux管理网络服务 永久生效配置路 ...