博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 3g状态及信号监测
阅读量:7096 次
发布时间:2019-06-28

本文共 4544 字,大约阅读时间需要 15 分钟。

hot3.png

/*

 * tel.getNetworkOperator()
 3G中国是460固定的,
 中国移动的是 46000
 中国联通的是 46001
 中国电信的是 46003
 *获取国别
 tel.getSimCountryIso()
 */

 public class My3GInfo {

  private WifiManager mWifi;
  private Context mContext;
  private Handler mHandler;
  private ImageView img;
  private String STRNetworkOperator[] = { "46000", "46001", "46003" };
  private int mark = -1;
  private int position;
  private int img3g[] = {};
  private boolean is3Ghave = false;
  private TelephonyManager tel;
  
  public My3GInfo(Context context, ImageView img) {
   mContext = context;
   this.img = img;
   init();
  }

  private void init() {

   // TODO Auto-generated method stub
   /* 可 参考一下相关的方法,得到自己想要的参数来处理自己的ui
    public void initListValues(){           
            tel.getDeviceId());//获取设备编号
            tel.getSimCountryIso());//获取SIM卡国别
            tel.getSimSerialNumber());//获取SIM卡序列号   
            (simState[tm.getSimState()]);//获取SIM卡状态
            (tel.getDeviceSoftwareVersion()!=null?tm.getDeviceSoftwareVersion():"未知"));    //获取软件版本
            tel.getNetworkOperator());//获取网络运营商代号
            tel.getNetworkOperatorName());//获取网络运营商名称
            (phoneType[tm.getPhoneType()]);//获取手机制式
            tel.getCellLocation().toString());//获取设备当前位置
       }*/
   tel = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 
    
    firstView();   
    getmark();
     //设置监听事件,监听信号强度的改变和状态的改变
   tel.listen(new PhoneStateMonitor(),
     PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
       | PhoneStateListener.LISTEN_SERVICE_STATE);
  }
  private void getmark()//得到当前电话卡的归属运营商
  {
   String strNetworkOperator = tel.getNetworkOperator();
   if (strNetworkOperator != null) {
    for (int i = 0; i < 3; i++) {
     if (strNetworkOperator.equals(STRNetworkOperator[i])) {
      mark = i;
      Log.v(TAG, "mark==" + i);
      break;
     }
    }
   } else {
    mark = -1;
   }
  }
  private void firstView() {//第一次自动检测并设置初始状态

   int state = tel.getSimState();

   switch (state) {
   case TelephonyManager.SIM_STATE_UNKNOWN:
    is3Ghave = false;
    break;
   case TelephonyManager.SIM_STATE_READY:
    is3Ghave = true;
    break;
   case TelephonyManager.SIM_STATE_ABSENT:
    is3Ghave = false;
    break;
   default:
    break;
   }  
  }

  private String TAG = "WHLOG";

  int signal;
  class PhoneStateMonitor extends PhoneStateListener {
   public void onSignalStrengthsChanged(SignalStrength signalStrength) {//3g信号强度的改变
    super.onSignalStrengthsChanged(signalStrength);
    /*
     * signalStrength.isGsm() 是否GSM信号 2G or 3G
     * signalStrength.getCdmaDbm(); 联通3G 信号强度
     * signalStrength.getCdmaEcio(); 联通3G 载干比
     * signalStrength.getEvdoDbm(); 电信3G 信号强度
     * signalStrength.getEvdoEcio(); 电信3G 载干比
     * signalStrength.getEvdoSnr(); 电信3G 信噪比
     * signalStrength.getGsmSignalStrength(); 2G 信号强度
     * signalStrength.getGsmBitErrorRate(); 2G 误码率    
     * 载干比 ,它是指空中模拟电波中的信号与噪声的比值
     */
    Log.v(TAG, "change signal");
    if(mark<0)
    {
     getmark();
    }
    if (mark == 0) {
     signal = signalStrength.getGsmSignalStrength();
    } else if (mark == 1) {
     signal = signalStrength.getCdmaDbm();
    } else if (mark == 2) {
     signal = signalStrength.getEvdoDbm();
    }
    if(is3Ghave==true){
    getLevel();
    show3GDetail(position);
    }
   }

   private void getLevel() {

    // TODO Auto-generated method stub
    if (mark == 2) {//电信3g信号强度的分类,可以按照ui自行划分等级
     if (signal >= -65)
      position = 5;
     else if (signal >= -75)
      position = 4;
     else if (signal >= -85)
      position = 3;
     else if (signal >= -95)
      position = 2;
     else if (signal >= -105)
      position = 1;
     else
      position = 0;
    }
    if (mark == 1) {//联通3g信号划分
     if (signal >= -75)
      position = 5;
     else if (signal >= -80)
      position = 4;
     else if (signal >= -85)
      position = 3;
     else if (signal >= -95)
      position = 2;
     else if (signal >= -100)
      position = 1;
     else
      position = 0;
    }
    if (mark == 0) {//移动信号的划分,这个不是很确定是2g还是3g
     if (signal <= 2 || signal == 99)
      position = 0;
     else if (signal >= 12)
      position = 5;
     else if (signal >= 10)
      position = 4;
     else if (signal >= 8)
      position = 3;
     else if (signal >= 5)
      position = 2;
     else
      position = 1;
    }
   }

   public void onServiceStateChanged(ServiceState serviceState) {//3g状态的改变

    super.onServiceStateChanged(serviceState);
    /*
     * ServiceState.STATE_EMERGENCY_ONLY 仅限紧急呼叫
     * ServiceState.STATE_IN_SERVICE 信号正常
     * ServiceState.STATE_OUT_OF_SERVICE 不在服务区
     * ServiceState.STATE_POWER_OFF 断电
     */
    int pos = serviceState.getState();
    Log.v(TAG, "state change===" + pos);

    switch (pos) {

    case ServiceState.STATE_EMERGENCY_ONLY:
     is3Ghave=true;
     show3GDetail(0);
     break;
    case ServiceState.STATE_IN_SERVICE:
     is3Ghave=true;  
     show3GDetail(3);
     break;
    case ServiceState.STATE_OUT_OF_SERVICE:
     is3Ghave=false;
     show3GDetail(6);
     break;
    case ServiceState.STATE_POWER_OFF:
     is3Ghave=false;
     show3GDetail(6);
     break;
    default:
     break;
    }
   }
  }

  private void show3GDetail(int level) {//设置显示3g的图标

   // TODO Auto-generated method stub
   if(is3Ghave==false)
   {
    img.setBackgroundResource(img3g[6]);
   }else{
   img.setBackgroundResource(img3g[level]);
   }
  }
 }

 

转载于:https://my.oschina.net/u/865093/blog/169481

你可能感兴趣的文章
Gitlab - Mac本机访问VirtualBox上搭建的Gitlab
查看>>
Bootstrap的Model源码详细注释 (转)
查看>>
java采用jxl写入一个Excel文件
查看>>
1171:大整数的因子
查看>>
传说中的数据结构 栈
查看>>
结对-结对编项目作业名称-设计文档
查看>>
Cesium 获取当前视图范围
查看>>
javascript基础
查看>>
加快普及智能家居DIY功能更受青睐
查看>>
python成长之路八 -- 内置函数
查看>>
【框架学习与探究之定时器--Quartz.Net 】
查看>>
Date 与 SimpleDateFormat
查看>>
C++ 11 创建和使用 unique_ptr
查看>>
文件的空间使用和IO统计
查看>>
软件产品评价
查看>>
2015 多校联赛 ——HDU5349(水)
查看>>
Golang的一些学习
查看>>
权谋残卷
查看>>
[网页游戏开发]使用编辑器制作界面
查看>>
BZOJ 2725: [Violet 6]故乡的梦
查看>>