Android手機(jī)信號強(qiáng)度檢測詳細(xì)介紹
最近到處在跑著找工作,難免在面試過程中遇到這樣那樣的問題,記得最清楚一次在面試過程中被問到,當(dāng)手機(jī)處于弱網(wǎng)狀態(tài)下,如何處理,如何監(jiān)聽網(wǎng)絡(luò)信號強(qiáng)度變化。但是真是蒙了,回答的亂七八糟,思路一點(diǎn)都不明確。今天小編在這里帶領(lǐng)大家了解下關(guān)于手機(jī)信號強(qiáng)度的相關(guān)幾個(gè)概念。
Android手機(jī)信號強(qiáng)度介紹
android定義了2種信號單位:dBm和asu。它們之間的關(guān)系是:dBm =-113+2asu,這是google給android手機(jī)定義的特有信號單位。例如,我的信號強(qiáng)度為-53dBm,則對應(yīng)30asu,因?yàn)?53 = -113 + (230) 。
詳細(xì)介紹兩者:
asu:alone signal unit 獨(dú)立信號單元,是一種模擬信號。ASU僅僅代表手機(jī)將它的位置傳遞給附近的信號塔的速率。它和dBm測量的是一樣的東西,但是是以一種更加線性的方式來表示。
dBm:是一個(gè)表示功率絕對值的值(也可以認(rèn)為是以1mW功率為基準(zhǔn)的一個(gè)比值),計(jì)算公式為:10log(功率值/1mw)。
[例] 如果功率P為1mw,折算為dBm后為0dBm。
[例] 對于0.01mW的功率,按dBm單位進(jìn)行折算后的值應(yīng)為: 10log(0.01/1)=-20dBm。
這個(gè)數(shù)值越大,表明信號越好。由于手機(jī)信號強(qiáng)度一般較小,折算成為dBm一般都是負(fù)數(shù)。
中國移動(dòng)的規(guī)范規(guī)定,手機(jī)接收電平>=(城市取-90dBm;鄉(xiāng)村取-94dBm) 時(shí),則滿足覆蓋要求,
也就是說此處無線信號強(qiáng)度滿足覆蓋要求.-67dBm要比-90dBm信號要強(qiáng)20多個(gè)dB,
那么它在打電話接通成功率和通話過程中的話音質(zhì)量都會(huì)好的多。再引入一個(gè)相關(guān)概念dB。
dB:是一個(gè)表征相對值的值,純粹的比值,只表示兩個(gè)量的相對大小關(guān)系,沒有單位,當(dāng)考慮甲的功率相比于乙功率大或小多少個(gè)dB時(shí),按下面的計(jì)算公式:10log(甲功率/乙功率),如果采用兩者的電壓 比計(jì)算,要用20log(甲電壓/乙電壓)。
[例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB,即甲的功率比乙的功率大3 dB。反之,如果甲的功率是乙的功率的一半,則甲的功率比乙的功率小3 dB。
總結(jié):dBm是負(fù)數(shù),越接近0信號強(qiáng)度越高,信號越好,但不可能為0。asu為正數(shù),值越大信號越好。dB是兩個(gè)量之間的比值,表示兩個(gè)量間的相對大小,而dBm則是表示功率絕對大小的值。
關(guān)于對數(shù)運(yùn)算,不記得的自行復(fù)習(xí)一下了。
下面再來了解一下網(wǎng)絡(luò)類型吧,還是很多的,不過在國內(nèi)只要了解國內(nèi)三大運(yùn)營商的網(wǎng)絡(luò)類型大概就可以了。
電信
2G CDMA
3G CDMA2000
4G TD-LTE,F(xiàn)DD-LTE
移動(dòng)
2G GSM
3G TD-SCDMA
4G TD-LTE,F(xiàn)DD-LTE
聯(lián)通
2G GSM
3G WCDMA
4G TD-LTE,F(xiàn)DD-LTE
而谷歌API給我們提供的有19種類型,在TelephonyManager類中定義,具體如下
/** Network type is unknown */ public static final int NETWORK_TYPE_UNKNOWN = 0; /** Current network is GPRS */ public static final int NETWORK_TYPE_GPRS = 1; /** Current network is EDGE */ public static final int NETWORK_TYPE_EDGE = 2; /** Current network is UMTS */ public static final int NETWORK_TYPE_UMTS = 3; /** Current network is CDMA: Either IS95A or IS95B*/ public static final int NETWORK_TYPE_CDMA = 4; /** Current network is EVDO revision 0*/ public static final int NETWORK_TYPE_EVDO_0 = 5; /** Current network is EVDO revision A*/ public static final int NETWORK_TYPE_EVDO_A = 6; /** Current network is 1xRTT*/ public static final int NETWORK_TYPE_1xRTT = 7; /** Current network is HSDPA */ public static final int NETWORK_TYPE_HSDPA = 8; /** Current network is HSUPA */ public static final int NETWORK_TYPE_HSUPA = 9; /** Current network is HSPA */ public static final int NETWORK_TYPE_HSPA = 10; /** Current network is iDen */ public static final int NETWORK_TYPE_IDEN = 11; /** Current network is EVDO revision B*/ public static final int NETWORK_TYPE_EVDO_B = 12; /** Current network is LTE */ public static final int NETWORK_TYPE_LTE = 13; /** Current network is eHRPD */ public static final int NETWORK_TYPE_EHRPD = 14; /** Current network is HSPA+ */ public static final int NETWORK_TYPE_HSPAP = 15; /** Current network is GSM {@hide} */ public static final int NETWORK_TYPE_GSM = 16; /** Current network is TD_SCDMA {@hide} */ public static final int NETWORK_TYPE_TD_SCDMA = 17; /** Current network is IWLAN {@hide} */ public static final int NETWORK_TYPE_IWLAN = 18;
下面通過一些實(shí)例來測試一下吧
首先記得加權(quán)限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
實(shí)例代碼
public class MainActivity extends AppCompatActivity { private static final int NETWORKTYPE_WIFI = 0; private static final int NETWORKTYPE_4G = 1; private static final int NETWORKTYPE_2G = 2; private static final int NETWORKTYPE_NONE = 3; public TextView mTextView; public TelephonyManager mTelephonyManager; public PhoneStatListener mListener; /** * 網(wǎng)絡(luò)信號強(qiáng)度監(jiān)聽 * * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textview); //獲取telephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //開始監(jiān)聽 mListener = new PhoneStatListener(); //監(jiān)聽信號強(qiáng)度 mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS); } @Override protected void onResume() { super.onResume(); mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS); } @Override protected void onPause() { super.onPause(); //用戶不在當(dāng)前頁面時(shí),停止監(jiān)聽 mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_NONE); } private class PhoneStatListener extends PhoneStateListener { //獲取信號強(qiáng)度 @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); //獲取網(wǎng)絡(luò)信號強(qiáng)度 //獲取0-4的5種信號級別,越大信號越好,但是api23開始才能用 // int level = signalStrength.getLevel(); int gsmSignalStrength = signalStrength.getGsmSignalStrength(); //獲取網(wǎng)絡(luò)類型 int netWorkType = getNetWorkType(MainActivity.this); switch (netWorkType) { case NETWORKTYPE_WIFI: mTextView.setText("當(dāng)前網(wǎng)絡(luò)為wifi,信號強(qiáng)度為:" + gsmSignalStrength); break; case NETWORKTYPE_2G: mTextView.setText("當(dāng)前網(wǎng)絡(luò)為2G移動(dòng)網(wǎng)絡(luò),信號強(qiáng)度為:" + gsmSignalStrength); break; case NETWORKTYPE_4G: mTextView.setText("當(dāng)前網(wǎng)絡(luò)為4G移動(dòng)網(wǎng)絡(luò),信號強(qiáng)度為:" + gsmSignalStrength); break; case NETWORKTYPE_NONE: mTextView.setText("當(dāng)前沒有網(wǎng)絡(luò),信號強(qiáng)度為:" + gsmSignalStrength); break; case -1: mTextView.setText("當(dāng)前網(wǎng)絡(luò)錯(cuò)誤,信號強(qiáng)度為:" + gsmSignalStrength); break; } } } public static int getNetWorkType(Context context) { int mNetWorkType = -1; ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { String type = networkInfo.getTypeName(); if (type.equalsIgnoreCase("WIFI")) { mNetWorkType = NETWORKTYPE_WIFI; } else if (type.equalsIgnoreCase("MOBILE")) { return isFastMobileNetwork(context) ? NETWORKTYPE_4G : NETWORKTYPE_2G; } } else { mNetWorkType = NETWORKTYPE_NONE;//沒有網(wǎng)絡(luò) } return mNetWorkType; } /**判斷網(wǎng)絡(luò)類型*/ private static boolean isFastMobileNetwork(Context context) { TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) { //這里只簡單區(qū)分兩種類型網(wǎng)絡(luò),認(rèn)為4G網(wǎng)絡(luò)為快速,但最終還需要參考信號值 return true; } return false; } }
關(guān)于信號獲取流程,這個(gè)還需深入研究,目前只在應(yīng)用層簡單獲取了網(wǎng)絡(luò)信號。
以上所述是小編給大家介紹的Android手機(jī)信號強(qiáng)度檢測詳細(xì)介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程解析
- Android自定義View展示W(wǎng)ifi信號強(qiáng)弱指示方法示例
- Android Init進(jìn)程對信號的處理流程詳細(xì)介紹
- android 獲取手機(jī)GSM/CDMA信號信息,并獲得基站信息的方法
- Android 模擬信號示波器示例代碼
- Android獲取當(dāng)前已連接的wifi信號強(qiáng)度的方法
- Android實(shí)現(xiàn)信號強(qiáng)度監(jiān)聽的方法
- Android提高之模擬信號示波器的實(shí)現(xiàn)
- android wifi信號強(qiáng)度等級區(qū)分的修改介紹
- Android獲取移動(dòng)網(wǎng)絡(luò)信號強(qiáng)度的方法
相關(guān)文章
Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法,通過繼承Adapter類實(shí)現(xiàn)ListView中的數(shù)據(jù)無限循環(huán)顯示功能,需要的朋友可以參考下2017-06-06Android?鼠標(biāo)光標(biāo)的圖形合成原理實(shí)例探究
這篇文章主要為大家介紹了Android?鼠標(biāo)光標(biāo)的圖形合成原理實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Android編程實(shí)現(xiàn)的EditText彈出打開和關(guān)閉工具類
這篇文章主要介紹了Android編程實(shí)現(xiàn)的EditText彈出打開和關(guān)閉工具類,涉及Android輸入框EditText彈出打開和關(guān)閉功能簡單實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-02-02Android項(xiàng)目開發(fā)常用工具類LightTaskUtils源碼介紹
LightTaskUtils是一個(gè)輕量級的線程管理工具,本文通過實(shí)例代碼給大家詳細(xì)介紹Android項(xiàng)目開發(fā)常用工具類LightTaskUtils的相關(guān)知識,感興趣的朋友一起看看吧2022-06-06Android 中okhttp自定義Interceptor(緩存攔截器)
這篇文章主要介紹了Android 中okhttp自定義Interceptor(緩存攔截器)的相關(guān)資料,需要的朋友可以參考下2017-03-03Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息
這篇文章主要介紹了Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息的相關(guān)資料,需要的朋友可以參考下2016-01-01