zoukankan      html  css  js  c++  java
  • [转]android 获取手机GSM/CDMA信号信息

    本文转自: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

     

  • 相关阅读:
    设计模式责任链模式(COR)
    设计模式享元模式(Flyweight)
    设计模式外观模式(Facade)
    设计模式桥接模式(Bridge)
    设计模式适配器(Adapter)
    设计模式解释器模式(Interpreter)
    Ext出来个3.0.1版本,不过不能免费下载了,郁闷
    150天成为JAVA高级程序员?
    Drools业务逻辑框架
    HQL中In的问题详解
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2332936.html
Copyright © 2011-2022 走看看