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信号是如何获取的吧。

      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

  • 相关阅读:
    Docker 部署 ElasticSearch-Head
    linux安装kibana-7.6.1
    CentOS部署ElasticSearch7.6.1集群
    linux 安装mysql 8
    Docker安装Mysql,并搭建一主一从复制集群,一主双从,双主双从集群
    linux 挂载光盘,rmp,yum
    git多账号登录问题
    js动态添加事件-事件委托
    yii2 RESTful api的详细使用
    yii2 ActiveRecord多表关联以及多表关联搜索的实现
  • 原文地址:https://www.cnblogs.com/qingblog/p/2598871.html
Copyright © 2011-2022 走看看