Android 移动网络相关的点
1.如何知道当前处于(使用)什么网络
public static int getNetworkType(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null ){ if( netInfo.isAvailable()) { return netInfo.getType(); }else { return -2; } } else { return -1; } }
ConnectivityManager#TYPE_MOBILE 移动网络 ConnectivityManager#TYPE_WIFI WiFi
ConnectivityManager#TYPE_WIMAX 无线城域网(国外使用) ConnectivityManager#TYPE_ETHERNET 以太网
ConnectivityManager#TYPE_BLUETOOTH 蓝牙
2. 如何确定使用哪一家运营商
public static String getNetworkOperatorName(Context context){ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String mNetworkOperator= telephonyManager.getNetworkOperator(); switch (mNetworkOperator) { case "46000": case "46002": case "46007": return "中国移动"; case "46001": case "46006": return "中国联通"; case "46003": case "46005": case "46011": return "中国电信"; case "41004": return "移动香港"; default: return ""; } }
3.如何确定使用是几G网络
public static String getTelNetWorkType(Context context){ TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int networkType = telephonyManager.getNetworkType(); switch (networkType) { /* GPRS : 2G(2.5) General Packet Radia Service 114kbps EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps UMTS : 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准 CDMA : 2G 电信 Code Division Multiple Access 码分多址 EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G EVDO_A : 3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G 1xRTT : 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡, HSDPA : 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps HSUPA : 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access IDEN : 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科) EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G EHRPD : 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级 HSPAP : 3G HSPAP 比 HSDPA 快些 */ // 2G网络 case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return "2G"; // 3G网络 case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: return "3G"; // 4G网络 case TelephonyManager.NETWORK_TYPE_LTE: return "4G"; default: return ""; } }
4.如何拿到卡的iccid(也就是卡的身份证,一张卡,手机号码可以变,iccid一定不会变)
TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
tm.getSimSerialNumber()
5.如何得到信号强度值
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //开始监听 mListener = new PhoneStatListener(); //监听信号强度 mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
private class PhoneStatListener extends PhoneStateListener { //获取信号强度 @Override public void onSignalStrengthChanged(int asu) { super.onSignalStrengthChanged(asu); } @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); getStatus(); //获取网络信号强度 //获取0-4的5种信号级别,越大信号越好,但是api23开始才能用 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { int level = signalStrength.getLevel(); System.out.println("level====" + level); if(level==4){ text_level.setText("很强"); iv_network_ap_signal.setImageResource(R.drawable.icon_wifi_leval_4); }else if(level==3){ text_level.setText("强"); iv_network_ap_signal.setImageResource(R.drawable.icon_wifi_leval_3); }else if(level==2){ text_level.setText("一般"); iv_network_ap_signal.setImageResource(R.drawable.icon_wifi_leval_2); } else if(level==1){ text_level.setText("弱"); iv_network_ap_signal.setImageResource(R.drawable.icon_wifi_leval_1); } } int cdmaDbm = signalStrength.getCdmaDbm(); int evdoDbm = signalStrength.getEvdoDbm(); LogPrint.d("cdmaDbm=====" + cdmaDbm); LogPrint.d("evdoDbm=====" + evdoDbm); for(CellSignalStrength mCellSignalStrength:signalStrength.getCellSignalStrengths()){ LogPrint.d("signalStrength=====" +mCellSignalStrength.getDbm() ); } int gsmSignalStrength = signalStrength.getGsmSignalStrength(); int dbm = -113 + 2 * gsmSignalStrength; LogPrint.d("gsmSignalStrength "+gsmSignalStrength+" dbm===========" + dbm); } }
CellSignalStrength 是一个父类,细分下来真实的表示移动信号的子类是CellSignalStrengthLte
public final class CellSignalStrengthLte extends CellSignalStrength
CellSignalStrengthLte 的mRsrp是表征移动信号强度的真实数据
有两个方法可以得到mRsrp
/** * Get reference signal received power in dBm * * @return the RSRP of the measured cell. */ public int getRsrp() { return mRsrp; }
/** * Get signal strength in dBm * * @return the RSRP of the measured cell. */ @Override public int getDbm() { return mRsrp; }
不过不能直接得到这个值
* {@link CellSignalStrengthLte#getRsrp}. * * @see android.telephony#CellSignalStrengthLte * @see android.telephony.SignalStrength#getCellSignalStrengths() * @hide */ @Deprecated @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public int getLteRsrp() { return mLte.getRsrp(); }
/** * Get the signal strength as dBm * * @deprecated this information should be retrieved from * {@link CellSignalStrength#getDbm()}. Because the levels vary by technology, * this method is misleading and should not be used. * @see android.telephony#CellSignalStrength * @see android.telephony.SignalStrength#getCellSignalStrengths * @hide */ @Deprecated @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public int getDbm() { return getPrimary().getDbm(); }
都是deprecated
有两个方法可以得到
private CellSignalStrength getPrimary() { // This behavior is intended to replicate the legacy behavior of getLevel() by prioritizing // newer faster RATs for default/for display purposes. if (mLteAsPrimaryInNrNsa) { if (mLte.isValid()) return mLte; } if (mNr.isValid()) return mNr; if (mLte.isValid()) return mLte; if (mCdma.isValid()) return mCdma; if (mTdscdma.isValid()) return mTdscdma; if (mWcdma.isValid()) return mWcdma; if (mGsm.isValid()) return mGsm; return mLte; }
for(CellSignalStrength mCellSignalStrength:signalStrength.getCellSignalStrengths()){ if(mCellSignalStrength instanceof CellSignalStrengthLte) { LogPrint.d("signalStrength=====" + mCellSignalStrength.getDbm()); } }
-40~-50 之间为在基站附近;
-50~-60 之间信号属于非常好;
-60~-70 之间信号属于良好;
-70~-80 之间属于信号稍弱;
-80~-90 之间属于信号弱;
-90~-100 以下为基本能通讯状态;
-110~-170 手机基本已没有信号。
6.如何准确的知道移动数据出了异常,移动网络断开了,或者连接上了
IntentFilter mFilter = new IntentFilter(); mFilter.addAction(Constant.ACTION_SIM_STATE_CHANGED); context.registerReceiver(myNetReceiver, mFilter);
其中 Constant.ACTION_SIM_STATE_CHANGED的值需要自己写
public final static String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) {case Constant.ACTION_SIM_STATE_CHANGED: //LogPrint.e(">>>>>>>>>>>>>>>>>>>>" + "移动网络变化 "); TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); int state = tm.getSimState(); LogPrint.i("main >>>>>>>>>>>>>>>>>>>> 移动网络 state "+state); switch (state) { case TelephonyManager.SIM_STATE_READY : // //simState = SIM_VALID; //LogPrint.i("有sim卡= "); // new ReportPhoneNumber().start(); if(tm.getNetworkType()>0&&tm.getNetworkType()<16) { setNet(); } break; case TelephonyManager.SIM_STATE_UNKNOWN : case TelephonyManager.SIM_STATE_ABSENT : case TelephonyManager.SIM_STATE_PIN_REQUIRED : case TelephonyManager.SIM_STATE_PUK_REQUIRED : case TelephonyManager.SIM_STATE_NETWORK_LOCKED : default: //simState = SIM_INVALID; // LogPrint.i("没sim卡="+simState); break; } break; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库