`
fengzhizi715
  • 浏览: 161620 次
  • 性别: Icon_minigender_1
  • 来自: 上海 苏州
社区版块
存档分类
最新评论

使用基站、wifi实现定位

阅读更多
    转载请注明出处
    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都来得更慢。
16
0
分享到:
评论
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  
如果能定位别人就爽了。

相关推荐

    基站定位和WIFI定位完美结合项目源码

    基站定位和WIFI定位是移动设备定位技术中的两种主要方法,它们在许多现代应用程序和服务中起着关键作用,如导航、紧急救援、社交网络和广告定向。本项目源码提供了将这两种定位方式完美结合的解决方案。 基站定位是...

    Android的基站、WIFI、GPS定位集合【源码】.zip

    - 使用`LocationManager`和`LocationListener`进行GPS、WIFI和基站定位的示例代码。 - 用于解析基站信息的工具类。 - 基于WIFI指纹的定位算法实现。 - 混合定位策略的管理类,负责根据环境动态切换定位方式。 - 示例...

    androidgps基站与WIFI定位源码.zip

    本资源“androidgps基站与WIFI定位源码.zip”提供了一套实现GPS、基站和Wi-Fi定位功能的源代码,非常适合Android开发者学习和参考。 首先,我们要理解Android系统中的定位机制。Android提供了Location API,这是一...

    androidGPS及WIFI基站定位坐标源码.zip

    在Android系统中,GPS(全球定位系统)和WIFI基站定位是两种常见的定位技术,...通过深入研究这些源码,开发者不仅可以了解如何在Android应用中实现定位功能,还能了解到如何处理各种实际场景下的问题,提升开发技能。

    Android Wifi Lbs 定位

    Android WiFi LBS(Location-Based Services,基于位置的服务)定位是通过结合WiFi网络信号和移动通信基站信息来确定设备的位置。这种定位方式在GPS信号不可用或者信号弱的室内环境尤为实用。下面将详细介绍Android ...

    GPS及WIFI基站定位坐标源码

    总结来说,“GPS及WIFI基站定位坐标源码”是关于如何在Android环境中实现高效且节能的位置定位服务的实例。它结合了GPS和WiFi基站两种定位方式,以满足不同场景下的定位需求,并可能涉及与网络通信的部分,将位置...

    android定位(基站,GPS,wifi)齐全

    `Android实现GPS定位.pdf`和`Android实现GPS定位(1).pdf`可能包含关于如何在Android应用中启用和使用GPS服务的教程。通常,开发者需要请求权限,调用LocationManager服务,注册GPS监听器,然后解析接收到的位置更新...

    android gps wifi 基站 定位齐全。源码

    本源码包专注于三种主要的定位技术:GPS(全球定位系统)、WiFi和基站定位。 GPS(全球定位系统)是最常见的定位方式,它通过接收多个卫星信号来计算设备的位置。在Android中,我们可以使用LocationManager类来请求...

    在Android里完美实现基站和WIFI定位

    在Android系统中,基站和WIFI定位是两种重要的位置服务技术,它们可以帮助应用程序获取设备的地理位置信息,即使在没有GPS的情况下也能实现定位。对于OPhone和部分国产Android定制机,由于默认不支持基站和WIFI定位...

    安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip

    这个压缩包“安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip”提供了一个实践示例,展示了如何在Android平台上实现基于GPS和WIFI的定位功能。下面将详细讲解这两个定位技术及其在源码中的应用。 1. GPS...

    android 基站、WIFI、GPS定位集合【源码】

    在Android平台上,实现精准的位置服务是开发者们常常面临的需求,这通常涉及到三种主要的定位技术:基站定位、Wi-Fi定位和GPS(全球定位系统)定位。这篇内容将深入探讨这些定位方式以及它们在源码中的实现。 1. **...

    android系统的wifi和基站地理信息定位完整代码实现

    在Android系统中,实现基于WiFi和基站的地理信息定位是一个重要的功能,这涉及到网络定位服务的集成和使用。本文将详细解析如何通过编程实现这一功能,主要涉及的技术点包括WiFi扫描、基站信息获取以及地理定位API的...

    gps.rar_GPS_GPS java_wifi定位_基站定位_定位

    本主题主要关注三种定位方法:GPS(全球定位系统)、GPS与Java的结合、WiFi定位以及基站定位。以下是对这些知识点的详细阐述: 1. GPS(全球定位系统): GPS是一种全球性的卫星导航系统,由美国建立并维护。它...

    最新的经纬度获取!wifi,基站,gps定位

    3. **基站定位**:通过分析手机连接的移动通信基站信号,可以估算出设备的位置。基站定位在没有Wi-Fi或GPS信号时依然有效,但精度通常低于GPS,可能在几百米到几千米之间。 为了使用百度定位服务,开发者需要集成...

    android google 定位程序 wifi基站GPS定位

    Android的Location API是实现定位的核心,它允许应用获取设备的位置信息。这个API提供了多种定位服务,包括GPS(全球定位系统)、Wi-Fi扫描以及移动网络(如蜂窝塔)的数据。这些服务可以单独使用,也可以组合起来,...

    基站定位的实现(百度)

    以下是对基站定位技术和如何使用百度地图API实现基站定位的详细说明。 **基站定位原理** 基站定位依赖于手机与周围基站的通信。每个基站都有一个独特的标识码,当手机连接到基站时,会记录下与多个基站的距离或信号...

    Android的基站、WIFI、GPS定位集合

    通过`requestLocationUpdates()`方法注册监听器,可以选择使用哪种定位服务,例如GPS、网络(包括基站和Wi-Fi)等。还可以设置定位更新的最小时间和距离间隔,以及所需的定位精度。 为了优化用户体验,开发者通常会...

    androidGPS及WIFI基站定位坐标源码_地图定位.zip

    本资源包含的"androidGPS及WIFI基站定位坐标源码"提供了实现这些功能的具体代码实现,对于开发者来说是很好的学习和参考材料。 GPS定位是通过接收来自多个GPS卫星的信号来计算设备的位置。Android系统提供了...

    wifi,基站.gps定位

    将这三种技术结合使用,可以实现更高效、更准确的定位服务。例如,户外使用GPS为主,进入室内时切换到Wi-Fi或基站定位。通过融合定位,系统可以根据当前环境动态选择最佳的定位方式,提供连续而稳定的定位服务。这种...

Global site tag (gtag.js) - Google Analytics