- 浏览: 161620 次
- 性别:
- 来自: 上海 苏州
最新评论
-
di1984HIT:
血的不错啊,
用HTTP GET调用web service(Java、Groovy两个版本) -
zxw13651485:
学习了!!!
使用基站、wifi实现定位 -
yanruxu801314:
不错,楼主确实有才,可我很奇怪的是,这个app现在还有更新么, ...
豆瓣同城的客户端---豆邻1.0 -
chen052210123:
每次都睡5秒,是不是不太好啊
在线升级Android应用程序完善版 -
zmwell:
楼主啊,我用你上面的程序进行定位,我在西安,却定位到了北京,这 ...
使用基站、wifi实现定位
转载请注明出处
android可以借助于gps实现定位,但是很多地方是使用gps无法定位比如在室内,而且gps定位的话速度慢。
那么如何克服这样的缺点使得应用程序在室内也可以定位呢?办法是有的借助于基站和wifi进行定位。具体的细节可参考:
http://code.google.com/intl/zh-CN/apis/gears/geolocation_network_protocol.html
下面的代码实现了定位的大致功能
CellIDInfo.java 封装了cellid的信息
WifiInfo.java 封装了wifi的信息
CellIDInfoManager.java 可获取所有的CellIDInfo
WifiInfoManager.java 可获取wifi的信息,目前我只取了当前连接的wifi,没有获取所有能扫描到的wifi信息。
调用google gears的方法,该方法调用gears来获取经纬度
目前已经测试过中国移动、联通的卡,以及测试过中兴的MIC,都可以准确定位。
不支持的是cdma,将cdma的数据传入到gears后返回的经纬度显示是在美国。
提外话,将gps和基站、wifi三者定位结合的话效果更好。基站的定位没有wifi准确,gps的定位速度比基站、wifi都来得更慢。
可以做啊,做一个app放到别人的手机里,然后她每次更隔一段时间更新位置或者说更新经纬度的时候,发邮件或者sms给你。
android可以借助于gps实现定位,但是很多地方是使用gps无法定位比如在室内,而且gps定位的话速度慢。
那么如何克服这样的缺点使得应用程序在室内也可以定位呢?办法是有的借助于基站和wifi进行定位。具体的细节可参考:
http://code.google.com/intl/zh-CN/apis/gears/geolocation_network_protocol.html
下面的代码实现了定位的大致功能
CellIDInfo.java 封装了cellid的信息
public class CellIDInfo { public int cellId; public String mobileCountryCode; public String mobileNetworkCode; public int locationAreaCode; public String radioType; public CellIDInfo(){} }
WifiInfo.java 封装了wifi的信息
public class WifiInfo { public String mac; public WifiInfo(){} }
CellIDInfoManager.java 可获取所有的CellIDInfo
import java.util.ArrayList; import java.util.List; import android.content.Context; import android.telephony.NeighboringCellInfo; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; public class CellIDInfoManager { private TelephonyManager manager; private PhoneStateListener listener; private GsmCellLocation gsm; private CdmaCellLocation cdma; int lac; String current_ci,mcc, mnc; public CellIDInfoManager(){} public ArrayList<CellIDInfo> getCellIDInfo(Context context){ manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); listener = new PhoneStateListener(); manager.listen(listener, 0); ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>(); CellIDInfo currentCell = new CellIDInfo(); int type = manager.getNetworkType(); if (type == TelephonyManager.NETWORK_TYPE_GPRS || type ==TelephonyManager.NETWORK_TYPE_EDGE || type ==TelephonyManager.NETWORK_TYPE_HSDPA) { gsm = ((GsmCellLocation) manager.getCellLocation()); if (gsm == null) return null; lac = gsm.getLac(); mcc = manager.getNetworkOperator().substring(0, 3); mnc = manager.getNetworkOperator().substring(3, 5); currentCell.cellId = gsm.getCid(); currentCell.mobileCountryCode = mcc; currentCell.mobileNetworkCode = mnc; currentCell.locationAreaCode = lac; currentCell.radioType = "gsm"; CellID.add(currentCell); List<NeighboringCellInfo> list = manager.getNeighboringCellInfo(); int size = list.size(); for (int i = 0; i < size; i++) { CellIDInfo info = new CellIDInfo(); info.cellId = list.get(i).getCid(); info.mobileCountryCode = mcc; info.mobileCountryCode = mnc; info.locationAreaCode = lac; CellID.add(info); } return CellID; } else if (type == TelephonyManager.NETWORK_TYPE_CDMA || type ==TelephonyManager.NETWORK_TYPE_1xRTT) { cdma = ((CdmaCellLocation) manager.getCellLocation()); if (cdma == null) return null; if ("460".equals(manager.getSimOperator().substring(0, 3))) return null; } return null; } }
WifiInfoManager.java 可获取wifi的信息,目前我只取了当前连接的wifi,没有获取所有能扫描到的wifi信息。
import java.util.ArrayList; import android.content.Context; import android.net.wifi.WifiManager; public class WifiInfoManager { WifiManager wm; public WifiInfoManager(){} public ArrayList getWifiInfo(Context context){ ArrayList<WifiInfo> wifi = new ArrayList(); wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = new WifiInfo(); info.mac = wm.getConnectionInfo().getBSSID(); wifi.add(info); return wifi; } }
调用google gears的方法,该方法调用gears来获取经纬度
private Location callGear(ArrayList<WifiInfo> wifi, ArrayList<CellIDInfo> cellID) { if (cellID == null) return null; DefaultHttpClient client = new DefaultHttpClient(); 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"); holder.put("home_mobile_country_code", cellID.get(0).mobileCountryCode); holder.put("home_mobile_network_code", cellID.get(0).mobileNetworkCode); holder.put("radio_type", cellID.get(0).radioType); holder.put("request_address", true); if ("460".equals(cellID.get(0).mobileCountryCode)) holder.put("address_language", "zh_CN"); else holder.put("address_language", "en_US"); JSONObject data,current_data; JSONArray array = new JSONArray(); current_data = new JSONObject(); current_data.put("cell_id", cellID.get(0).cellId); current_data.put("mobile_country_code", cellID.get(0).mobileCountryCode); current_data.put("mobile_network_code", cellID.get(0).mobileNetworkCode); current_data.put("age", 0); array.put(current_data); if (cellID.size() > 2) { for (int i = 1; i < cellID.size(); i++) { data = new JSONObject(); data.put("cell_id", cellID.get(i).cellId); data.put("location_area_code", cellID.get(0).locationAreaCode); data.put("mobile_country_code", cellID.get(0).mobileCountryCode); data.put("mobile_network_code", cellID.get(0).mobileNetworkCode); data.put("age", 0); array.put(data); } } holder.put("cell_towers", array); if (wifi.get(0).mac != null) { data = new JSONObject(); data.put("mac_address", wifi.get(0).mac); data.put("signal_strength", 8); data.put("age", 0); array = new JSONArray(); array.put(data); holder.put("wifi_towers", array); } StringEntity se = new StringEntity(holder.toString()); Log.e("Location send", holder.toString()); post.setEntity(se); HttpResponse resp = client.execute(post); HttpEntity entity = resp.getEntity(); BufferedReader br = new BufferedReader( new InputStreamReader(entity.getContent())); StringBuffer sb = new StringBuffer(); String result = br.readLine(); while (result != null) { Log.e("Locaiton reseive", result); sb.append(result); result = br.readLine(); } data = new JSONObject(sb.toString()); data = (JSONObject) data.get("location"); Location loc = new 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(AppUtil.getUTCTime()); return loc; } catch (JSONException e) { return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
目前已经测试过中国移动、联通的卡,以及测试过中兴的MIC,都可以准确定位。
不支持的是cdma,将cdma的数据传入到gears后返回的经纬度显示是在美国。
提外话,将gps和基站、wifi三者定位结合的话效果更好。基站的定位没有wifi准确,gps的定位速度比基站、wifi都来得更慢。
评论
6 楼
zxw13651485
2012-11-09
学习了!!!
5 楼
zmwell
2012-07-06
楼主啊,我用你上面的程序进行定位,我在西安,却定位到了北京,这误差是不是太大了啊,能否跟你交流一下呢?
4 楼
llyrike
2012-05-11
google不是自带了定位的api吗?网络定位也在其中吧,为什么还要自己写这么多呢,设置一个监听不就得了?请指示
3 楼
大柳树
2011-07-11
没有例子吗?
2 楼
fengzhizi715
2010-12-02
superhanliu 写道
如果能定位别人就爽了。
可以做啊,做一个app放到别人的手机里,然后她每次更隔一段时间更新位置或者说更新经纬度的时候,发邮件或者sms给你。
1 楼
superhanliu
2010-12-02
如果能定位别人就爽了。
发表评论
-
豆瓣同城的客户端---豆邻1.0
2011-04-01 15:23 2106豆邻是豆瓣同城的android客户端。具有豆瓣同城的功 ... -
【原创】实现类似街旁网的分享足迹功能
2011-03-06 16:19 3167转载请注明出处 在sina微博上看到街旁网的客户端有 ... -
【原创】时客地图1.7
2011-03-03 00:23 1782时客地图是一款android上的app,目前的最新版本是1.7 ... -
【原创】时客地图1.6
2011-02-12 12:07 1235时客地图是一款android上的app,目前的最新版本是1.6 ... -
【原创】时客地图1.5
2011-01-28 13:18 1240时客地图是一款android上的app,目前的最新版本是1.5 ... -
关于自适应屏幕方向和大小的一些经验
2010-11-10 13:57 5034转载请注明出处 刚开始,我开发时选取的模拟 ... -
Android隐性Intent的例子
2010-11-02 17:38 7931转载请注明出处 Android的Intent分为两大 ... -
Android 线程超时的例子
2010-11-02 15:09 9333转载请注明出处 android的线程和java的线程是 ... -
在线升级Android应用程序完善版
2010-10-29 16:07 14467转载请注明出处 发一个完善版本的 思路还是原来的思路,上一篇 ... -
在线升级Android应用程序的思路
2010-10-24 23:53 4008转载请注明出处 如果某个app有内嵌的s ... -
通过地名获得经纬度并标识在地图上
2010-10-19 17:30 6067转载请注明出处 主要是调用Geocoder的getFromL ... -
分享一款android的日历组件
2010-10-17 15:28 3875转载请注明出处 这个日历组 ... -
多个Activity跳转的小结
2010-10-17 15:03 21687转载请注明出处 在android开发中Activity相当于 ... -
时客1.4
2010-07-03 12:58 1217增加公交线路的详细信息: 1)公交线路的查询 2)公交站点途径 ... -
时客1.3
2010-06-15 22:36 1019在1.2版本中增加了地铁的查询功能,在1.3版本中新增了查询打 ... -
刚做的2款应用
2010-06-08 00:05 1187由于刚升级了android的固件到2.1,因此我也将我 ... -
比价器0.1版本
2010-06-01 23:23 1390做了一个比较当当 卓越 china-pub 图书的价格 ... -
时客1.0beta发布
2010-02-28 15:06 1019时客,可以查询火车班次、飞机航班 我在G2上 ... -
做了一个可以查询飞机航班、火车班次的小应用
2010-02-14 15:01 3537做得很粗糙,代码量也很少,数据通过调用web service得 ...
相关推荐
基站定位和WIFI定位是移动设备定位技术中的两种主要方法,它们在许多现代应用程序和服务中起着关键作用,如导航、紧急救援、社交网络和广告定向。本项目源码提供了将这两种定位方式完美结合的解决方案。 基站定位是...
- 使用`LocationManager`和`LocationListener`进行GPS、WIFI和基站定位的示例代码。 - 用于解析基站信息的工具类。 - 基于WIFI指纹的定位算法实现。 - 混合定位策略的管理类,负责根据环境动态切换定位方式。 - 示例...
本资源“androidgps基站与WIFI定位源码.zip”提供了一套实现GPS、基站和Wi-Fi定位功能的源代码,非常适合Android开发者学习和参考。 首先,我们要理解Android系统中的定位机制。Android提供了Location API,这是一...
在Android系统中,GPS(全球定位系统)和WIFI基站定位是两种常见的定位技术,...通过深入研究这些源码,开发者不仅可以了解如何在Android应用中实现定位功能,还能了解到如何处理各种实际场景下的问题,提升开发技能。
Android WiFi LBS(Location-Based Services,基于位置的服务)定位是通过结合WiFi网络信号和移动通信基站信息来确定设备的位置。这种定位方式在GPS信号不可用或者信号弱的室内环境尤为实用。下面将详细介绍Android ...
总结来说,“GPS及WIFI基站定位坐标源码”是关于如何在Android环境中实现高效且节能的位置定位服务的实例。它结合了GPS和WiFi基站两种定位方式,以满足不同场景下的定位需求,并可能涉及与网络通信的部分,将位置...
`Android实现GPS定位.pdf`和`Android实现GPS定位(1).pdf`可能包含关于如何在Android应用中启用和使用GPS服务的教程。通常,开发者需要请求权限,调用LocationManager服务,注册GPS监听器,然后解析接收到的位置更新...
本源码包专注于三种主要的定位技术:GPS(全球定位系统)、WiFi和基站定位。 GPS(全球定位系统)是最常见的定位方式,它通过接收多个卫星信号来计算设备的位置。在Android中,我们可以使用LocationManager类来请求...
在Android系统中,基站和WIFI定位是两种重要的位置服务技术,它们可以帮助应用程序获取设备的地理位置信息,即使在没有GPS的情况下也能实现定位。对于OPhone和部分国产Android定制机,由于默认不支持基站和WIFI定位...
这个压缩包“安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip”提供了一个实践示例,展示了如何在Android平台上实现基于GPS和WIFI的定位功能。下面将详细讲解这两个定位技术及其在源码中的应用。 1. GPS...
在Android平台上,实现精准的位置服务是开发者们常常面临的需求,这通常涉及到三种主要的定位技术:基站定位、Wi-Fi定位和GPS(全球定位系统)定位。这篇内容将深入探讨这些定位方式以及它们在源码中的实现。 1. **...
在Android系统中,实现基于WiFi和基站的地理信息定位是一个重要的功能,这涉及到网络定位服务的集成和使用。本文将详细解析如何通过编程实现这一功能,主要涉及的技术点包括WiFi扫描、基站信息获取以及地理定位API的...
本主题主要关注三种定位方法:GPS(全球定位系统)、GPS与Java的结合、WiFi定位以及基站定位。以下是对这些知识点的详细阐述: 1. GPS(全球定位系统): GPS是一种全球性的卫星导航系统,由美国建立并维护。它...
3. **基站定位**:通过分析手机连接的移动通信基站信号,可以估算出设备的位置。基站定位在没有Wi-Fi或GPS信号时依然有效,但精度通常低于GPS,可能在几百米到几千米之间。 为了使用百度定位服务,开发者需要集成...
Android的Location API是实现定位的核心,它允许应用获取设备的位置信息。这个API提供了多种定位服务,包括GPS(全球定位系统)、Wi-Fi扫描以及移动网络(如蜂窝塔)的数据。这些服务可以单独使用,也可以组合起来,...
以下是对基站定位技术和如何使用百度地图API实现基站定位的详细说明。 **基站定位原理** 基站定位依赖于手机与周围基站的通信。每个基站都有一个独特的标识码,当手机连接到基站时,会记录下与多个基站的距离或信号...
通过`requestLocationUpdates()`方法注册监听器,可以选择使用哪种定位服务,例如GPS、网络(包括基站和Wi-Fi)等。还可以设置定位更新的最小时间和距离间隔,以及所需的定位精度。 为了优化用户体验,开发者通常会...
本资源包含的"androidGPS及WIFI基站定位坐标源码"提供了实现这些功能的具体代码实现,对于开发者来说是很好的学习和参考材料。 GPS定位是通过接收来自多个GPS卫星的信号来计算设备的位置。Android系统提供了...
将这三种技术结合使用,可以实现更高效、更准确的定位服务。例如,户外使用GPS为主,进入室内时切换到Wi-Fi或基站定位。通过融合定位,系统可以根据当前环境动态选择最佳的定位方式,提供连续而稳定的定位服务。这种...