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

本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/

 

在Android中我们常用的轻松获取WIFI信号列表,那如何获取CDMA或者GSM的手机信号呢?
系统提供了TelephonyManager类,此类非常丰富,基本你所需要的手机信息都能获取到,那下面就来看看我们所需要的CDMA与GSM信号是如何获取的吧。

  1 private TelephonyManager telephonyManager;
  2 private PhoneStateListener phoneStateListener;
  3 首先声明两个变量
  4 
  5 
  6 
  7 
  8 在onCreate()方法中初始化变量
  9 InitPhoneStateListener();
 10 telephonyManager = (TelephonyManager) this.ctx.getSystemService(Context.TELEPHONY_SERVICE);
 11 telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
 12 telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CELL_LOCATION);
 13 if(telephonyManager.getCellLocation()!=null){
 14 //获取当前基站信息
 15 phoneStateListener.onCellLocationChanged(telephonyManager.getCellLocation());
 16 }
 17 
 18 
 19 
 20 
 21 /** 初始化PhoneStateListener */
 22 private void InitPhoneStateListener() {
 23 phoneStateListener = new PhoneStateListener() {
 24 @Override
 25 public void onCellLocationChanged(CellLocation location) {
 26 // TODO Auto-generated method stub
 27 if (location instanceof GsmCellLocation) {// gsm网络
 28 phoneType = 1;
 29 GsmCell gsmCell = new GsmCell();
 30 gsmCell.lac = ((GsmCellLocation) location).getLac();
 31 gsmCell.cid = ((GsmCellLocation) location).getCid();
 32 /** 获取mcc,mnc */
 33 String mccMnc=telephonyManager.getNetworkOperator();
 34 if(mccMnc!=null&&mccMnc.length()>=5){
 35 gsmCell.mcc = mccMnc.substring(0, 3);
 36 gsmCell.mnc = mccMnc.substring(3, 5);
 37 }
 38 gsmCell.signal=lastSignal;
 39 gsmCell.time = System.currentTimeMillis();
 40 if (gsmCell.lac != -1 && gsmCell.cid != -1) {
 41 gsmCells.add(0, gsmCell);
 42 // Collections.sort(gsmCells);
 43 // /**最多保存近3个基站信息*/
 44 // if (gsmCells.size() >3)
 45 // gsmCells.remove(3);
 46 }
 47 //获取相邻基站信息
 48 List neighboringList=telephonyManager.getNeighboringCellInfo();
 49 for(NeighboringCellInfo ni:neighboringList){
 50 GsmCell gb = new GsmCell();
 51 gb.mnc=mccMnc.substring(3, 5);
 52 gb.lac=ni.getLac();
 53 gb.cid=ni.getCid();
 54 gb.signal=-133+2*ni.getRssi();
 55 gb.time=System.currentTimeMillis();
 56 gsmCells.add(gb);
 57 }
 58 } else {// 其他CDMA等网络
 59 try {
 60 Class cdmaClass = Class.forName("android.telephony.cdma.CdmaCellLocation");
 61 phoneType = 2;
 62 CdmaCellLocation cdma = (CdmaCellLocation) location;
 63 CdmaCell cdmaCell = new CdmaCell();
 64 cdmaCell.stationId = cdma.getBaseStationId() >= 0 ?
 65 cdma.getBaseStationId(): cdmaCell.stationId;
 66 cdmaCell.networkId = cdma.getNetworkId() >= 0 ? cdma
 67 .getNetworkId() : cdmaCell.networkId;
 68 cdmaCell.systemId = cdma.getSystemId() >= 0 ? cdma
 69 .getSystemId() : cdmaCell.systemId;
 70 /** 获取mcc,mnc */
 71 String mccMnc=telephonyManager.getNetworkOperator();
 72 if(mccMnc!=null&&mccMnc.length()>=5){
 73 cdmaCell.mcc = mccMnc.substring(0, 3);
 74 cdmaCell.mnc = mccMnc.substring(3, 5);
 75 }
 76 cdmaCell.signal=lastSignal;
 77 cdmaCell.time = System.currentTimeMillis();
 78 int lat = cdma.getBaseStationLatitude();
 79 int lon = cdma.getBaseStationLongitude();
 80 if (lat <Integer.MAX_VALUE&& lon <Integer.MAX_VALUE) {
 81 cdmaCell.lat = lat;
 82 cdmaCell.lon = lon;
 83 }
 84 if (cdmaCell.stationId != -1&& cdmaCell.networkId != -1&& cdmaCell.systemId != -1) {
 85 cdmaCells.add(0, cdmaCell);
 86 }
 87 List neighboringList=telephonyManager.getNeighboringCellInfo();
 88 for(NeighboringCellInfo ni:neighboringList){
 89 CdmaCell cdmaBean = new CdmaCell();
 90 cdmaBean.systemId=cdmaCell.systemId;
 91 cdmaBean.lac=ni.getLac();
 92 cdmaBean.cellid=ni.getCid();
 93 cdmaBean.signal=-113+2*ni.getRssi();
 94 cdmaCells.add(cdmaBean);
 95 }
 96 } catch (ClassNotFoundException classnotfoundexception) {
 97 }
 98 }// end CDMA网络
 99 super.onCellLocationChanged(location);
100 }// end onCellLocationChanged
101 
102 
103 
104 
105 @Override
106 public void onServiceStateChanged(ServiceState serviceState) {
107 // TODO Auto-generated method stub
108 super.onServiceStateChanged(serviceState);
109 }
110 @Override
111 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
112 // TODO Auto-generated method stub
113 int asu=signalStrength.getGsmSignalStrength();
114 lastSignal=-113+2*asu; //信号强度
115 super.onSignalStrengthsChanged(signalStrength);
116 }
117 };
118 }// end InitPhoneStateListener

其实很简单,只要写好了监听类,一切信号都可以获取得到。
这样,我们很轻松的就获取到了手机信号及周围基站的信号强度了,当然,需要的读取手机状态等的权限就在这里不说了。

作者:sojex
Email:w.sojex@gmail.com

原文地址:https://www.cnblogs.com/qingblog/p/2598871.html