Android 移动网络相关的点

发布时间 2023-12-07 09:56:32作者: balder_m

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());
                }
            }

 

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;
            }
        }