[地理位置] android 定位的几种方式介绍

开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络中现有对于介绍android定位的几种方式,希望对大家有帮助:

android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,

(1) Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了)。通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电;2,绝大部分用户默认不开启GPS模块;3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;4,室内几乎无法使用。这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:

uses-permission android:name= android.permission.ACCESS_FINE_LOCATION   /uses-permission

具体实现代码如下:                                             首先判断GPS模块是否存在或者是开启:                                             private voidopenGPSSettings() {                                                     LocationManager alm = (LocationManager)this                                                            .getSystemService(Context.LOCATION_SERVICE);                                                     if (alm                                                            .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {                                                         Toast.makeText(this,  GPS模块正常 ,Toast.LENGTH_SHORT)                                                                 .show();                                                         return;                                                     }                                                     Toast.makeText(this,  请开启GPS! ,Toast.LENGTH_SHORT).show();                                                     Intent intent = newIntent(Settings.ACTION_SECURITY_SETTINGS);                                                    startActivityForResult(intent,0); //此为设置完成后返回到获取界面                                                 }                                             如果开启正常,则会直接进入到显示页面,如果开启不正常,则会进行到GPS设置页面:                                             获取代码如下:                                             private voidgetLocation()                                                 {                                                     // 获取位置管理服务                                                     LocationManager locationManager;                                                     String serviceName = Context.LOCATION_SERVICE;                                                     locationManager = (LocationManager)this.getSystemService(serviceName);                                                     // 查找到服务信息                                                     Criteria criteria = new Criteria();                                                    criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度                                                     criteria.setAltitudeRequired(false);                                                     criteria.setBearingRequired(false);                                                     criteria.setCostAllowed(true);                                                    criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗                                                     String provider =locationManager.getBestProvider(criteria, true); // 获取GPS信息                                                     Location location =locationManager.getLastKnownLocation(provider); // 通过GPS获取位置                                                     updateToNewLocation(location);                                                     // 设置监听*器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米                                                     locationManager.requestLocationUpdates(provider,100 * 1000, 500,                                                             locationListener);    }                                             到这里就可以获取到地理位置信息了,但是还是要显示出来,那么就用下面的方法进行显示:                                             代码                                             private voidupdateToNewLocation(Location location) {                                                     TextView tv1;                                                     tv1 = (TextView)this.findViewById(R.id.tv1);                                                     if (location != null) {                                                         double  latitude = location.getLatitude();                                                         double longitude=location.getLongitude();                                                         tv1.setText( 维度: +  latitude+  \n经度  +longitude);                                                     } else {                                                         tv1.setText( 无法获取地理信息 );                                                     }                                                 }

(2)Android 基站定位:Android 基站定位只要明白了基站/WIFI定位的原理,自己实现基站/WIFI定位其实不难。基站定位一般有几种,第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标;第二种则是利用获取最近的基站的信息,其中包括基站 id,location area code、mobile country code、mobile network code和信号强度,将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在几十米到几百米之内。其中信号强度这个数据很重要,这里笔者就不多做解释了,直接给出一个文章,这个文章写的非常好,http://www.cnblogs.com/rayee/archive/2012/02/02/2336101.html

(3)Android Wifi定位:根据一个固定的WifiMAC地址,通过收集到的该Wifi热点的位置,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在Android也统称为Network方式。

代码:

public classWiFiInfoManager implements Serializable {                                                 private static final long serialVersionUID= -4582739827003032383L;                                                 private Context context;                                                 public WiFiInfoManager(Context context) {                                                     super();                                                     this.context = context;                                                 }                                                 public WifiInfo getWifiInfo() {                                                     WifiManager manager = (WifiManager)context                                                            .getSystemService(Context.WIFI_SERVICE);                                                     WifiInfo info = new WifiInfo();                                                     info.mac =manager.getConnectionInfo().getBSSID();                                                     Log.i( TAG ,  WIFI MACis:  + info.mac);                                                     return info;                                                 }                                                 public class WifiInfo {                                                     public String mac;                                                     public WifiInfo() {                                                         super();                                                     }                                                 }                                             }                                             上面是取到WIFI的mac地址的方法,下面是把地址发送给google服务器,代码如下                                             public staticLocation getWIFILocation(WifiInfo wifi) {                                                     if (wifi == null) {                                                         Log.i( TAG ,  wifiis null. );                                                         return null;                                                     }                                                     DefaultHttpClient client = newDefaultHttpClient();                                                     HttpPost post = new HttpPost( http://www.google.com/loc/json );                                                     JSONObject holder = new JSONObject();                                                     try {                                                         holder.put( version , 1.1.0 );                                                         holder.put( host , maps.google.com );                                                         JSONObject data;                                                         JSONArray array = new JSONArray();                                                         if (wifi.mac != null   wifi.mac.trim().length()   0) {                                                             data = new JSONObject();                                                            data.put( mac_address , wifi.mac);                                                            data.put( signal_strength , 8);                                                             data.put( age , 0);                                                             array.put(data);                                                         }                                                         holder.put( wifi_towers ,array);                                                         Log.i( TAG , request json:  + holder.toString());                                                         StringEntity se = newStringEntity(holder.toString());                                                         post.setEntity(se);                                                         HttpResponse resp =client.execute(post);                                                         int state =resp.getStatusLine().getStatusCode();                                                         if (state == HttpStatus.SC_OK) {                                                             HttpEntity entity =resp.getEntity();                                                             if (entity != null) {                                                                 BufferedReader br = newBufferedReader(                                                                         newInputStreamReader(entity.getContent()));                                                                 StringBuffer sb = newStringBuffer();                                                                 String resute =  ;                                                                 while ((resute =br.readLine()) != null) {                                                                     sb.append(resute);                                                                 }                                                                 br.close();                                                                 Log.i( TAG , response json:  + sb.toString());                                                                 data = newJSONObject(sb.toString());                                                                 data = (JSONObject)data.get( location );                                                                 Location loc = newLocation(                                                                        android.location.LocationManager.NETWORK_PROVIDER);                                                                 loc.setLatitude((Double)data.get( latitude ));                                                                 loc.setLongitude((Double)data.get( longitude ));                                                                loc.setAccuracy(Float.parseFloat(data.get( accuracy )                                                                         .toString()));                                                                 loc.setTime(System.currentTimeMillis());                                                                 return loc;                                                             } else {                                                                 return null;                                                             }                                                         } else {                                                             Log.v( TAG , state +  );                                                             return null;                                                         }                                                     } catch (Exception e) {                                                         Log.e( TAG ,e.getMessage());                                                         return null;                                                     }                                                 }

(3.1)而WIFI定位与基站定位的结合,笔者也在网上找到一个很好的文章,笔者对此就不做任何解释,直接给出网址:                                             http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html

(4)AGPS定位:AGPS(AssistedGPS:辅助全球卫星定位系统)是结合GSM或GPRS与传统卫星定位,利用基地台代送辅助卫星信息,以缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补,减轻GPS芯片对卫星的依赖度。和纯GPS、基地台三角定位比较,AGPS能提供范围更广、更省电、速度更快的定位服务,理想误差范围在10公尺以内,日本和美国都已经成熟运用AGPS于LBS服务(Location Based Service,基于位置的服务)。AGPS技术是一种结合了网络基站信息和GPS信息对移动台进行定位的技术,可以在GSM/GPRS、WCDMA和CDMA2000网络中使进行用。该技术需要在手机内增加GPS接收机模块,并改造手机的天线,同时要在移动网络上加建位置服务器、差分GPS基准站等设备。AGPS解决方案的优势主要体现在其定位精度上,在室外等空旷地区,其精度在正常的GPS工作环境下,可以达到10米左右,堪称目前定位精度最高的一种定位技术。该技术的另一优点为:首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟

android 定位的几种方式介绍的更多相关文章

  1. android 定位的四种方式

    [原文]  开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面总结了一下网络中现有对于介绍android定位的4种方式,希望对大家有帮助: android 定 ...

  2. Android视频播放的两种方式介绍

    1.在Android 中播放视频的方式有两种: 第一种方式是使用MediaPlayer 结合SurfaceView 来播放,通过MediaPlayer来控制视频的播放.暂停.进度等: 通过Surfac ...

  3. Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式

    参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...

  4. Android 数据存储五种方式

    1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: ① 使用Shared ...

  5. Mysql查看版本号的五种方式介绍

    Mysql查看版本号的五种方式介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-03   一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到 ...

  6. Android Drawable的9种子类 介绍

    原文: Android Drawable的9种子类 介绍   Drawable 在android里面 就是代表着图像,注意是图像 而不是图片. 图片是图像的子集.图像除了可以包含图片以外 还可以包含颜 ...

  7. Android 反射-换一种方式编程

    Android 反射-换一种方式编程 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933 本文出自[赵彦军的博客] 上一 ...

  8. 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...

  9. MySQL查看版本号的五种方式介绍1111111

    MySQL查看版本号的五种方式介绍 1 命令行模式登录MySQL [root@localhost ~]# mysql -uroot -p Enter password: Welcome to the ...

随机推荐

  1. javax.mail.MessagingException: Could not connect to SMTP host: smtp.xdf.cn

    1.问题描述:关于使用Java Mail进行邮件发送,抛出Could not connect to SMTP host: xx@xxx.com, port: 25的异常可能: 当我们使用Java Ma ...

  2. CentOS 7 安装 docker-machine

    https://github.com/docker/machine/releases/ 指令: curl -L https://github.com/docker/machine/releases/d ...

  3. SSH或者SSM开发web,mysql数据库,数据库配置文件配置不当~数据库读写数据乱码问题解决办法。

    相信,大家都有遇到过在传入一个中文string,debug自己的每一行代码时,都发现始终是没有乱码的(即:排除了,源码文件的编码格式是没问题的),但是数据进入数据库之后就是乱掉了. 那么很明显问题就出 ...

  4. Ubuntu 安装mysql

    ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server   2. apt-get isntall mysql-clie ...

  5. hdoj1006--Tick and Tick

    Problem Description The three hands of the clock are rotating every second and meeting each other ma ...

  6. 在Windows下使用adb logcat grep

    在Windows下使用adb logcat  grep 会提示 因为grep 为Linux命令,所以不能使用.怎么办呢? 这时候可以用到babun 下载地址:http://babun.github.i ...

  7. Spring Boot入门——json数据处理

    1.引入fastJson插件 <!-- 引入fastjson插件 --> <dependency> <groupId>com.alibaba</groupId ...

  8. codeforces 777C.Alyona and Spreadsheet 解题报告

    题目链接:http://codeforces.com/problemset/problem/777/C 题目意思:给出一个 n * m 的矩阵,然后问 [l, r] 行之间是否存在至少一列是非递减序列 ...

  9. phalcon 连接多个数据库 phalcon multi-database

    db: //This service returns a MySQL database $di->set('dbMaster', function() { return new \Phalcon ...

  10. svn上传文件钩子

    svn钩子 钩子脚本就是shell的写法,钩子就是被某些版本库事件触发的程序. 常用钩子: post-commit:在提交完成成功创建之后执行该钩子.(提交已经完成,不可更改) 更新之后,通过邮件.微 ...