Android TelephonyManager 信号强度
手机网络信号强度的单位是 dBm
(毫瓦分贝),一般用负数表示
正常手机信号变化范围是从 -110dBm
(差)到 -50dBm
(好)之间,如果比 -50dBm 还小的话,说明你就站在基站的附近
2G,3G,4G 获得信号强度的方式都是重写 PhoneStateListener 的 onSignalStrengthsChanged()
方法,当信号强度发生改变的时候就会触发这个事件,我们可以在这个事件里获取信号强度
关于 dBm
,还有一个定公式
dBm = -113+2*asu
asu (独立信号单元)
另外因为笔者的卡都是移动卡,联通和电信的不知道,但是从源码里看到这样几个 API,应该可以用啦里直接获取信号强度
方法 | 说明 |
---|---|
getEvdoDbm() | 电信 3G |
getCdmaDbm() | 联通 3G |
getLteDbm() | 4G |
范例
我们写一个 demo 来获取当前的手机的信号强度
-
创建一个 空的 Android 项目
cn.twle.android.PhoneDBM
-
修改
activity_main.xml
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="32dp"> <TextView android:id="@+id/ms_dbm_info" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
-
修改
AndroidManifest.xml
获取手机状态改变权限<!-- 添加访问手机状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
修改 MainActivity.java
package cn.twle.android.phonedbm; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView ms_dbm_info; private TelephonyManager tm; private PhoneStateListener listener = new PhoneStateListener() { private int asu = 0,lastSignal = 0; @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { asu = signalStrength.getGsmSignalStrength(); lastSignal = -113 + 2 * asu; ms_dbm_info.setText("当前手机的信号强度:" + lastSignal + " dBm" ); super.onSignalStrengthsChanged(signalStrength); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tm = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)); ms_dbm_info = (TextView) findViewById(R.id.ms_dbm_info); tm.listen(listener,290); } }