您的位置:首页 > 移动开发 > Android开发

[转]android 获取手机GSM/CDMA信号信息

2014-05-07 15:55 344 查看
http://blog.csdn.net/hanvy_xia/article/details/8003185
http://www.cnblogs.com/freeliver54/archive/2012/01/31/2332936.html
本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/

在Android中我们常用的轻松获取WIFI信号列表,那如何获取CDMA或者GSM的手机信号呢?

系统提供了TelephonyManager类,此类非常丰富,基本你所需要的手机信息都能获取到,那下面就来看看我们所需要的CDMA与GSM信号是如何获取的吧。

private TelephonyManager telephonyManager;

private PhoneStateListener phoneStateListener;

首先声明两个变量

在onCreate()方法中初始化变量

InitPhoneStateListener();

telephonyManager = (TelephonyManager) this.ctx.getSystemService(Context.TELEPHONY_SERVICE);

telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CELL_LOCATION);

if(telephonyManager.getCellLocation()!=null){

//获取当前基站信息

phoneStateListener.onCellLocationChanged(telephonyManager.getCellLocation());

}

/** 初始化PhoneStateListener */

private void InitPhoneStateListener() {

phoneStateListener = new PhoneStateListener() {

@Override

public void onCellLocationChanged(CellLocation location) {

// TODO Auto-generated method stub

if (location instanceof GsmCellLocation) {// gsm网络

phoneType = 1;

GsmCell gsmCell = new GsmCell();

gsmCell.lac = ((GsmCellLocation) location).getLac();

gsmCell.cid = ((GsmCellLocation) location).getCid();

/** 获取mcc,mnc */

String mccMnc=telephonyManager.getNetworkOperator();

if(mccMnc!=null&&mccMnc.length()>=5){

gsmCell.mcc = mccMnc.substring(0, 3);

gsmCell.mnc = mccMnc.substring(3, 5);

}

gsmCell.signal=lastSignal;

gsmCell.time = System.currentTimeMillis();

if (gsmCell.lac != -1 && gsmCell.cid != -1) {

gsmCells.add(0, gsmCell);

// Collections.sort(gsmCells);

// /**最多保存近3个基站信息*/

// if (gsmCells.size() >3)

// gsmCells.remove(3);

}

//获取相邻基站信息

List neighboringList=telephonyManager.getNeighboringCellInfo();

for(NeighboringCellInfo ni:neighboringList){

GsmCell gb = new GsmCell();

gb.mnc=mccMnc.substring(3, 5);

gb.lac=ni.getLac();

gb.cid=ni.getCid();

gb.signal=-133+2*ni.getRssi();

gb.time=System.currentTimeMillis();

gsmCells.add(gb);

}

} else {// 其他CDMA等网络

try {

Class cdmaClass = Class.forName("android.telephony.cdma.CdmaCellLocation");

phoneType = 2;

CdmaCellLocation cdma = (CdmaCellLocation) location;

CdmaCell cdmaCell = new CdmaCell();

cdmaCell.stationId = cdma.getBaseStationId() >= 0 ?

cdma.getBaseStationId(): cdmaCell.stationId;

cdmaCell.networkId = cdma.getNetworkId() >= 0 ? cdma

.getNetworkId() : cdmaCell.networkId;

cdmaCell.systemId = cdma.getSystemId() >= 0 ? cdma

.getSystemId() : cdmaCell.systemId;

/** 获取mcc,mnc */

String mccMnc=telephonyManager.getNetworkOperator();

if(mccMnc!=null&&mccMnc.length()>=5){

cdmaCell.mcc = mccMnc.substring(0, 3);

cdmaCell.mnc = mccMnc.substring(3, 5);

}

cdmaCell.signal=lastSignal;

cdmaCell.time = System.currentTimeMillis();

int lat = cdma.getBaseStationLatitude();

int lon = cdma.getBaseStationLongitude();

if (lat <Integer.MAX_VALUE&& lon <Integer.MAX_VALUE) {

cdmaCell.lat = lat;

cdmaCell.lon = lon;

}

if (cdmaCell.stationId != -1&& cdmaCell.networkId != -1&& cdmaCell.systemId != -1) {

cdmaCells.add(0, cdmaCell);

}

List neighboringList=telephonyManager.getNeighboringCellInfo();

for(NeighboringCellInfo ni:neighboringList){

CdmaCell cdmaBean = new CdmaCell();

cdmaBean.systemId=cdmaCell.systemId;

cdmaBean.lac=ni.getLac();

cdmaBean.cellid=ni.getCid();

cdmaBean.signal=-113+2*ni.getRssi();

cdmaCells.add(cdmaBean);

}

} catch (ClassNotFoundException classnotfoundexception) {

}

}// end CDMA网络

super.onCellLocationChanged(location);

}// end onCellLocationChanged

@Override

public void onServiceStateChanged(ServiceState serviceState) {

// TODO Auto-generated method stub

super.onServiceStateChanged(serviceState);

}

@Override

public void onSignalStrengthsChanged(SignalStrength signalStrength) {

// TODO Auto-generated method stub

int asu=signalStrength.getGsmSignalStrength();

lastSignal=-113+2*asu; //信号强度

super.onSignalStrengthsChanged(signalStrength);

}

};

}// end InitPhoneStateListener

其实很简单,只要写好了监听类,一切信号都可以获取得到。

这样,我们很轻松的就获取到了手机信号及周围基站的信号强度了,当然,需要的读取手机状态等的权限就在这里不说了。

作者:sojex

Email:w.sojex@gmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐