android 获取手机GSM/CDMA信号信息

fmms 8年前
     <p>在Android中我们常用的轻松获取WIFI信号列表,那如何获取CDMA或者GSM的手机信号呢?<br /> 系统提供了TelephonyManager类,此类非常丰富,基本你所需要的手机信息都能获取到,那下面就来看看我们所需要的CDMA与GSM信号是如何获取的吧</p>    <pre class="brush:java; toolbar: true; auto-links: false;">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</pre>    <p>其实很简单,只要写好了监听类,一切信号都可以获取得到。<br /> 这样,我们很轻松的就获取到了手机信号及周围基站的信号强度了,当然,需要的读取手机状态等的权限就在这里不说了。</p>    <p><br /> Email:w.sojex@gmail.com</p>    <p>文章出处:<a href="/misc/goto?guid=4959500248136747864" rel="nofollow" target="_blank">http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/</a></p>