android 3G 手机信号 信息获取

转于:http://blog.csdn.net/hanvy_xia/article/details/8003185

-----------------------------------------------------------------------------------------

在androi中手机信号信息的获取可以通过系统提供的TELEPHONY_SERVICE获取

 

[java]  view plain copy
 
  1. TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  


TelephonyManager 可以监听 PhoneStateListener, PhoneStateListener 提供了

 

 

[java]  view plain copy
 
  1. onSignalStrengthsChanged   手机信号变动  
  2. onServiceStateChanged      手机服务状态变动  


其中onSignalStrengthsChanged可以获取到的有用信息如下:

 

 

扫描二维码关注公众号,回复: 571020 查看本文章
[java]  view plain copy
 
  1. /* 
  2.   signalStrength.isGsm()           是否GSM信号 2G or 3G  
  3.   signalStrength.getCdmaDbm();     联通3G 信号强度 
  4.   signalStrength.getCdmaEcio();    联通3G 载干比 
  5.   signalStrength.getEvdoDbm();     电信3G 信号强度 
  6.   signalStrength.getEvdoEcio();    电信3G 载干比 
  7.   signalStrength.getEvdoSnr();     电信3G 信噪比 
  8.   signalStrength.getGsmSignalStrength();  2G 信号强度 
  9.   signalStrength.getGsmBitErrorRate();    2G 误码率 
  10.  
  11.   载干比 ,它是指空中模拟电波中的信号与噪声的比值 
  12. */   

奇怪的是移动的3G信号TD-SCDMA 信息没办法获取到

 

而onServiceStateChanged 提供的状态变动如下:

[java]  view plain copy
 
  1. /* 
  2.   ServiceState.STATE_EMERGENCY_ONLY   仅限紧急呼叫 
  3.   ServiceState.STATE_IN_SERVICE       信号正常 
  4.   ServiceState.STATE_OUT_OF_SERVICE   不在服务区 
  5.   ServiceState.STATE_POWER_OFF        断电 
  6. */  

 

以下给出具体的实例:

1.在布局文件中增加一个3G图标,和显示具体信息的文本  (activity_g3_example.xml)

 

[html]  view plain copy
 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     android:gravity="center"  
  6.     android:orientation="vertical">  
  7.   
  8.     <ImageButton  
  9.         android:id="@+id/Icon_3GStatus"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:src="@drawable/ic_3g"/>  
  13.       
  14.     <TextView  
  15.         android:id="@+id/Label_3GDetail"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:maxWidth="320dp"/>  
  19.   
  20. </LinearLayout>  


2. 为3G图标添加一组可选的图标,在drawable-hdpi目录下增加ic_3g.xml文件,内容如下:

 

 

[html]  view plain copy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <level-list xmlns:android="http://schemas.android.com/apk/res/android">  
  4.     <item android:maxLevel="60"  android:drawable="@drawable/ic_3g_s3" />  
  5.     <item android:maxLevel="90"  android:drawable="@drawable/ic_3g_s2" />  
  6.     <item android:maxLevel="96"  android:drawable="@drawable/ic_3g_s1" />  
  7.     <item android:maxLevel="100" android:drawable="@drawable/ic_3g_s0" />  
  8. </level-list>  


注意需要导入用到的图片

 

 

3.在代码中监听手机信号和状态的变动  (G3Example.java)

[java]  view plain copy
 
  1. package com.example.g3example;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.content.Context;  
  6. import android.telephony.PhoneStateListener;  
  7. import android.telephony.ServiceState;  
  8. import android.telephony.SignalStrength;  
  9. import android.telephony.TelephonyManager;  
  10. import android.util.Log;  
  11. import android.view.Menu;  
  12. import android.widget.ImageButton;  
  13. import android.widget.TextView;  
  14.   
  15. public class G3Example extends Activity {  
  16.   
  17.     private final String TAG = "G3Example";  
  18.   
  19.     private ImageButton       mIcon3G;  
  20.     private TextView          mLabel3G;  
  21.   
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_g3_example);  
  26.   
  27.         mIcon3G  = (ImageButton)findViewById(R.id.Icon_3GStatus);  
  28.         mLabel3G = (TextView)findViewById(R.id.Label_3GDetail);   
  29.   
  30.         TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  
  31.         tel.listen(new PhoneStateMonitor(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_SERVICE_STATE);  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean onCreateOptionsMenu(Menu menu) {  
  36.         getMenuInflater().inflate(R.menu.activity_g3_example, menu);  
  37.         return true;  
  38.     }  
  39.   
  40.     public class PhoneStateMonitor extends PhoneStateListener{  
  41.         public void onSignalStrengthsChanged(SignalStrength signalStrength) {  
  42.             super.onSignalStrengthsChanged(signalStrength);  
  43.             /* 
  44.             signalStrength.isGsm()           是否GSM信号 2G or 3G  
  45.             signalStrength.getCdmaDbm();     联通3G 信号强度 
  46.             signalStrength.getCdmaEcio();    联通3G 载干比 
  47.             signalStrength.getEvdoDbm();     电信3G 信号强度 
  48.             signalStrength.getEvdoEcio();    电信3G 载干比 
  49.             signalStrength.getEvdoSnr();     电信3G 信噪比 
  50.             signalStrength.getGsmSignalStrength();  2G 信号强度 
  51.             signalStrength.getGsmBitErrorRate();    2G 误码率 
  52.  
  53.             载干比 ,它是指空中模拟电波中的信号与噪声的比值 
  54.              */   
  55.             mLabel3G.setText("IsGsm : " + signalStrength.isGsm() +   
  56.                     "\nCDMA Dbm : " + signalStrength.getCdmaDbm() + "Dbm" +   
  57.                     "\nCDMA Ecio : " + signalStrength.getCdmaEcio() +  "dB*10" +  
  58.                     "\nEvdo Dbm : " + signalStrength.getEvdoDbm() + "Dbm" +   
  59.                     "\nEvdo Ecio : " + signalStrength.getEvdoEcio() + "dB*10" +   
  60.                     "\nGsm SignalStrength : " + signalStrength.getGsmSignalStrength() +   
  61.                     "\nGsm BitErrorRate : " + signalStrength.getGsmBitErrorRate());  
  62.   
  63.             mIcon3G.setImageLevel(Math.abs(signalStrength.getGsmSignalStrength()));  
  64.         }  
  65.   
  66.         public void onServiceStateChanged(ServiceState serviceState){  
  67.             super.onServiceStateChanged(serviceState);  
  68.   
  69.             /* 
  70.              ServiceState.STATE_EMERGENCY_ONLY   仅限紧急呼叫 
  71.              ServiceState.STATE_IN_SERVICE       信号正常 
  72.              ServiceState.STATE_OUT_OF_SERVICE   不在服务区 
  73.              ServiceState.STATE_POWER_OFF        断电 
  74.              */  
  75.             switch(serviceState.getState())  
  76.             {  
  77.             case ServiceState.STATE_EMERGENCY_ONLY:  
  78.                 Log.d(TAG, "3G STATUS : STATE_EMERGENCY_ONLY");  
  79.                 break;  
  80.             case ServiceState.STATE_IN_SERVICE:  
  81.                 Log.d(TAG, "3G STATUS : STATE_IN_SERVICE");  
  82.                 break;  
  83.             case ServiceState.STATE_OUT_OF_SERVICE:  
  84.                 Log.d(TAG, "3G STATUS : STATE_OUT_OF_SERVICE");  
  85.                 break;  
  86.             case ServiceState.STATE_POWER_OFF:  
  87.                 Log.d(TAG, "3G STATUS : STATE_POWER_OFF");  
  88.                 break;  
  89.             default:  
  90.                 break;  
  91.             }  
  92.         }  
  93.     }  
  94. }  

 

4. 最后在AndroidManifest.xml增加获取手机信号权限的支持

 

[html]  view plain copy
 
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  

猜你喜欢

转载自yuemeiqing2008-163-com.iteye.com/blog/2077489