Rexsee API介绍:基站定位功能,Android CellLocation源码

标签: rexsee api 基站 | 发表时间:2012-03-20 10:28 | 作者:
出处:http://www.iteye.com

先提示一点,不能使用用模拟器研究Android的基站定位:基站信息是来自运营商的,仿真器只能模拟网络延迟(-netdelay)、网速(-netspeed)、以及一些电话相关的操作,gsm <call|accept|busy|cancel|data|hold|list|voice|status>。还不能模拟信号。

 

一段基于Rexsee( http://www.rexsee.com/ )的基本示例demo,其中cid 和 lac 为经纬度。

function query(){
  var loction = eval('('+rexseeCellLocation.getLastKnownLocation()+')');
  var type = location.type.toLowerCase();
  var mcc = parseInt(location.operator.substring(0,3));
  var mnc = (type=='gsm')?parseInt(location.operator.substring(3)):location.systemId;
  var cid= (type=='gsm')?location.cid:location.baseStationId;
  var lac= (type=='gsm')?location.lac:location.networkId;
  var postData="{\version\":\"1.1.0\",\"host\":\maps.google.com\",\"access_token\";\"2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe\",\"home_mobile_country_code\":"+mcc+",\"home_mobile_network_code\":"+mnc+",\"address_language\";\"zh_CN\",\"radio_type\";\""+type+"\",\"request_address\":true,\"cell_towers\":[{\"cell_id\":+cid+",\"location_area_code\":+lac+",\"mobile_aountry_code\":"+mcc+",\"mobile_network_code\":"+mnc+",\"timing_advance\":5555}]}";

alert(rexseeAjax.syncSubmit('http://www.google.com/loc/json',postData,'utf-8'));
}
 

返回的结果是:

 

需要注意几个问题:

1. 如果直接用alert(rexseeCellLocation.getLastKnownLocation()); 这个方法得到的经纬度会是两个非常大的数字 所以需要通过ajax提交到"http://www.google.com/loc/json" 把所需要的经纬度返回来;

2. 开始监听,一旦位置发生变化,会触发事件onCellLocationChanged。所以,要在 onCellLocationChanged中写代码,调用你的query函数。而不是直接使用onclick测试。

 

Rexsee扩展函数介绍

 

【函数】 boolean isEnabled()

【说明】 是否正在监听基站定位的变化。

【返回】 true或false。

【参数】 无

【示例】

alert(rexseeCellLocation.isEnabled());
 

【函数】 boolean enable()

【说明】 开始监听,一旦位置发生变化,会触发事件onCellLocationChanged。

【返回】 true或false。

【参数】 无

【示例】

alert(rexseeCellLocation.enable());
 

【函数】 boolean disable()

【说明】 停止监听。

【返回】 true或false。

【参数】 无

【示例】

alert(rexseeCellLocation.disable());
 

【函数】 JsonObject getLastKnownLocation()

【说明】 读取基站定位数据,注意,CDMA网络和GSM网络的定位数据格式是不同的。

【返回】 JSON对象,使用eval('('+json+')')转换为JavaScript对象。

【参数】 无

【示例】

alert(rexseeCellLocation.getLastKnownLocation());
 

rexseeCellLocation.java源码如下:

 

/* 
* Copyright (C) 2011 The Rexsee Open Source Project 
* 
* Licensed under the Rexsee License, Version 1.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*      http://www.rexsee.com/CN/legal/license.html 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
 
package rexsee.location;  
 
import rexsee.core.browser.JavascriptInterface;  
import rexsee.core.browser.RexseeBrowser;  
import android.content.Context;  
import android.telephony.CellLocation;  
import android.telephony.PhoneStateListener;  
import android.telephony.TelephonyManager;  
import android.telephony.cdma.CdmaCellLocation;  
import android.telephony.gsm.GsmCellLocation;  
 
public class RexseeCellLocation implements JavascriptInterface {  
 
       private static final String INTERFACE_NAME = "CellLocation";  
       @Override  
       public String getInterfaceName() {  
               return mBrowser.application.resources.prefix + INTERFACE_NAME;  
       }  
       @Override  
       public JavascriptInterface getInheritInterface(RexseeBrowser childBrowser) {  
               return this;  
       }  
       @Override  
       public JavascriptInterface getNewInterface(RexseeBrowser childBrowser) {  
               return new RexseeCellLocation(childBrowser);  
       }  
 
       public static final String EVENT_ONCELLLOCATIONCHANGED = "onCellLocationChanged";  
 
       public final Context mContext;  
       private final RexseeBrowser mBrowser;  
       private final int mPhoneType;  
       private PhoneStateListener mListener = null;  
       private CellLocation mLocation = null;  
 
       public RexseeCellLocation(RexseeBrowser browser) {  
               mContext = browser.getContext();  
               mBrowser = browser;  
               browser.eventList.add(EVENT_ONCELLLOCATIONCHANGED);  
               TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);  
               mPhoneType = tm.getPhoneType();  
       }  
 
       //JavaScript Interface  
       public boolean isEnabled() {  
               return mListener != null;  
       }  
       public boolean enable() {  
               try {  
                       TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);  
                       mListener = new PhoneStateListener() {  
                               @Override  
                               public void onCellLocationChanged(CellLocation location) {  
                                       mLocation = location;  
                                       mBrowser.eventList.run(EVENT_ONCELLLOCATIONCHANGED);  
                               }  
                       };  
                       tm.listen(mListener, PhoneStateListener.LISTEN_CELL_LOCATION);  
                       return true;  
               } catch (Exception e) {  
                       mBrowser.exception(getInterfaceName(), e);  
                       return false;  
               }  
       }  
       public boolean disable() {  
               if (mListener == null) return true;  
               try {  
                       TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);  
                       tm.listen(mListener, PhoneStateListener.LISTEN_NONE);  
                       mListener = null;  
                       return true;  
               } catch (Exception e) {  
                       mBrowser.exception(getInterfaceName(), e);  
                       return false;  
               }  
       }  
       public String getLastKnownLocation() {  
               if (mLocation == null) return "{}";  
               TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);  
               String rtn = "";  
               rtn += "\"operator\":\"" + tm.getNetworkOperator() + "\"";  
               rtn += ",\"operatorName\":\"" + tm.getNetworkOperatorName() + "\"";  
               if (mPhoneType == TelephonyManager.PHONE_TYPE_GSM) {  
                       GsmCellLocation gsm = (GsmCellLocation) mLocation;  
                       rtn += ",\"type\":\"GSM\"";  
                       rtn += ",\"cid\":" + gsm.getCid();  
                       rtn += ",\"lac\":" + gsm.getLac();  
               } else if (mPhoneType == TelephonyManager.PHONE_TYPE_CDMA) {  
                       CdmaCellLocation cdma = (CdmaCellLocation) mLocation;  
                       rtn += ",\"type\":\"CDMA\"";  
                       rtn += ",\"baseStationId\":" + cdma.getBaseStationId();  
                       rtn += ",\"baseStationLatitude\":" + cdma.getBaseStationLatitude();  
                       rtn += ",\"baseStationLongitude\":" + cdma.getBaseStationLongitude();  
                       rtn += ",\"networkId\":" + cdma.getNetworkId();  
                       rtn += ",\"systemId\":" + cdma.getSystemId();  
               }  
               return "{" + rtn + "}";  
       }  
 
	}
仅对Rexsee的源码和函数事件做了整理,相关的demo或源码解析可以在Rexsee社区了解,目前Rexsee已提供了近2000个扩展,覆盖Android原生功能超过90%,且全部开放: http://www.rexsee.com/ 

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [rexsee api 基站] 推荐:

Rexsee API介绍:基站定位功能,Android CellLocation源码

- - ITeye博客
先提示一点,不能使用用模拟器研究Android的基站定位:基站信息是来自运营商的,仿真器只能模拟网络延迟(-netdelay)、网速(-netspeed)、以及一些电话相关的操作,gsm . 一段基于Rexsee( http://www.rexsee.com/ )的基本示例demo,其中cid 和 lac 为经纬度.

Api Blocking

- - xiaobaoqiu Blog
4.RateLimiter实现限流. 接口限流是保证系统稳定性的三大法宝之一(缓存, 限流, 降级).. 本文使用三种方式实现Api限流, 并提供了一个用Spring实现的Api限流的简单Demo, Demo的git地址: https://github.com/xiaobaoqiu/api-blocking.

股票API

- 狗尾草 - 博客园-首页原创精华区
股票数据的获取目前有如下两种方法可以获取:. http/javascript接口取数据. 1.http/javascript接口取数据. 以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据. 这个url会返回一串文本,例如:. var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92, .

API 与 ABI

- Ant - A Geek&#39;s Page
(本文亦是《C语言编程艺术》中的一部分,所以请勿用于商业用途. 一些程序员居然对API和ABI这两个概念都不清楚,我感到有些惊讶. 这里以 Linux 内核为例简单解释一下. API,顾名思义,是编程的接口,换句话说也就是你编写“应用程序”时候调用的函数之类的东西. 对于内核来说,它的“应用程序”有两种:一种是在它之上的,用户空间的真正的应用程序,内核给它们提供的是系统调用这种接口,比如 read(2),write(2);另一种就是内核模块了,它们和内核处于同一层,内核给它们提供的是导出的内核函数,比如 kmalloc(),printk().

Google+ API发布

- 屁清新健脑 - Solidot
开发者终于等来了期待已久的Google+ API. Google正式发布了允许读取用户公开信息的API,开发者可以借助API开发与Google+交互的应用程序,或将其整合到网站上. Google社交网站发布2个月来,经历了用户暴涨,但也出现了热度下降. Google+ API的发布也许能给予它一个新动力.

API 之下

- - 阮一峰的网络日志
虽然标题里面有 API,但是本文谈的不是编程,而是更重要的事情. 很多公司的组织架构,都有一个中层. 高层领导和基层员工之间,存在大量的中层干部. 2015年,硅谷创业家 莱因哈特(Peter Reinhardt)观察到一个现象:硅谷科技公司正在变得越来越大,但是公司的中层几乎没有变大. 原因就在于,大公司正在用 API 替代掉中层干部.

API 网关 Kong

- - IT瘾-tuicool
所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层. 最初是单体服务时,客户端发起的所有请求都可以直接请求到该服务,但随着产品用户越来越多,单体应用存在显而易见的单点问题,除此之外,当单体应用大小升至几个 G 时,持续发布将会非常缓慢,所以服务的拆分成为了必然趋势.

Windows API 调用监视工具 API Monitor

- 简单香草 - 开源中国社区最新软件
API Monitor 是一款用来监视和显示用户应用程序和服务程序中的Windows API调用的免费软件. 它是一个强大的工具,在跟踪调试你开发的应用程序时,可以帮助发现产生问题可能的原因. API Monitor支持windows 7及windows 64位系统.

Java API 设计清单 « 友好的API

- - 东西
在设计Java API的时候总是有很多不同的规范和考量. 与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度. 就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程中回忆起那些明确的或者不明确的规范. 本文也可以看作为“ API设计指南”这篇文章的附录. 我们还准备了一些前后比对的例子来展示这个列表如何帮助你理清设计需求,找出错误,识别糟糕的设计实践以及如何寻找改进的时机.

MongoDB REST Api介绍

- peigen - NoSQLFan
MongoDB默认会开启一个HTTP协议的端口提供REST的服务,这个端口是你Server端口加上1000,比如你的Server端口为27017,那么这个HTTP端口就是28017,默认的HTTP端口功能是有限的,你可以通过添加–rest参数启动更多功能. 下面是在这个端口通过其RESTFul 的API操作MongoDB数据的几个例子,来源是MongoDB官方文档.