Android取得携帯電話の信号強度まとめ

8766 ワード

雪の中の香梅、まず春が早く来ることを知らせます.--(宋)欧陽修『バタフライ恋花』
今の天気はますます寒くなって、凛とした寒風の中を歩くたびに、心の中で1つの考えがあって、春(休み)の日(期)はどうしてまだ来ません!みんなが共感しているかどうか分かりません.先日、携帯電話の信号を取得する小さなプログラムを作りました.そこで、ネットでたくさん検索して、2つの方法を見つけましたが、残念ながら通じませんでした.山重水が途方にくれた時、三つ目の方法を見て、早速試してみました--ああ(^o^)/成功しました!そこでこの3つの方法を整理してみんなと分かち合います!
まず,携帯電話の信号に関する情報を取得するにはアクセス権が必要であり,ここでは動的にアクセス権を申請する方法を紹介する.必要な権限をリストします.
private String[] permissions =
 {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.CHANGE_NETWORK_STATE,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.MODIFY_PHONE_STATE};

購買依頼権限:
for (int j = 0;j < permissions.length; j++){
    int i = ContextCompat.checkSelfPermission(this, permissions[j]);
    //           GRANTED---    DINIED---  
    if (i != PackageManager.PERMISSION_GRANTED) {
        //          ,        
        ActivityCompat.requestPermissions(this, permissions, 321);
    }
}

1つ目の方法:
    public void getCurrentNetDBM(Context context) {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        PhoneStateListener mylistener = new PhoneStateListener() {
            @Override
            public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                super.onSignalStrengthsChanged(signalStrength);
                String signalInfo = signalStrength.toString();
                String[] params = signalInfo.split(" ");
                if (tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
                    //4G        >-90dBm     
                    int Itedbm = Integer.parseInt(params[9]);
                    Log.e("66666", "onSignalStrengthsChanged: " + Itedbm + "");
                } else if (tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSDPA ||
                        tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSPA ||
                        tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSUPA ||
                        tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS) {
                    //3G        >-90dBm        ps:    3G           dbm    (85dbm)
                    //           3G,       3G        ,                          
                    String yys = NetUtils.getOperatorName(getApplication());//       
                    if (yys == "    ") {
                        Log.e("66666", "onSignalStrengthsChanged: " + 0 + "");//    3G    ,     0
                    } else if (yys == "    ") {
                        int cdmaDbm = signalStrength.getCdmaDbm();
                        Log.e("66666", "onSignalStrengthsChanged: " + cdmaDbm + "");
                    } else if (yys == "    ") {
                        int evdoDbm = signalStrength.getEvdoDbm();
                        Log.e("66666", "onSignalStrengthsChanged: " + evdoDbm + "");
                    }
                } else {
                    //2G      >-90dBm     
                    int asu = signalStrength.getGsmSignalStrength();
                    int dbm = -113 + 2 * asu;
                    Log.e("66666", "onSignalStrengthsChanged: " + dbm + "");
                }
            }
        };
        //    
        tm.listen(mylistener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
    }

実験により,この方法はonSignalStrengthsChanged()法をトリガすることができるが,得られた信号強度はずっと−1(実験信号は北京聯通4 G)であり,明らかに実際に合わない.
2つ目の方法:
    public void signal() {
        List infos;
        TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        infos = mTelephonyManager.getNeighboringCellInfo();
        StringBuffer sb = new StringBuffer("   : " + infos.size() + "
"); for (NeighboringCellInfo info1 : infos) { // sb.append(" LAC : " + info1.getLac()); // LAC sb.append(" CID : " + info1.getCid()); // CID sb.append(" BSSS : " + (-113 + 2 * info1.getRssi()) + "
"); // } Log.e("66666", " :" + sb.toString()); }

この方法は実行可能に見えるが,実際の実験過程でgetNeighboringCellInfo()メソッドの戻り値はnullのままであり,関連資料を調べるとGoogle APIの問題と言われ,修復を期待しているだろう.
3つ目の方法は、私が見つけた唯一の方法です.
    public void getMobileDbm()
    {
        int dbm = -1;
        TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
        List cellInfoList = tm.getAllCellInfo();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
        {
            if (null != cellInfoList)
            {
                for (CellInfo cellInfo : cellInfoList)
                {
                    if (cellInfo instanceof CellInfoGsm)
                    {
                        CellSignalStrengthGsm cellSignalStrengthGsm = ((CellInfoGsm)cellInfo).getCellSignalStrength();
                        dbm = cellSignalStrengthGsm.getDbm();
                        Log.e("66666", "cellSignalStrengthGsm" + cellSignalStrengthGsm.toString());
                    }
                    else if (cellInfo instanceof CellInfoCdma)
                    {
                        CellSignalStrengthCdma cellSignalStrengthCdma = ((CellInfoCdma)cellInfo).getCellSignalStrength();
                        dbm = cellSignalStrengthCdma.getDbm();
                        Log.e("66666", "cellSignalStrengthCdma" + cellSignalStrengthCdma.toString() );
                    }
                    else if (cellInfo instanceof CellInfoWcdma)
                    {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
                        {
                            CellSignalStrengthWcdma cellSignalStrengthWcdma = ((CellInfoWcdma)cellInfo).getCellSignalStrength();
                            dbm = cellSignalStrengthWcdma.getDbm();
                            Log.e("66666", "cellSignalStrengthWcdma" + cellSignalStrengthWcdma.toString() );
                        }
                    }
                    else if (cellInfo instanceof CellInfoLte)
                    {
                        CellSignalStrengthLte cellSignalStrengthLte = ((CellInfoLte)cellInfo).getCellSignalStrength();
                        dbm = cellSignalStrengthLte.getDbm();
                        Log.e("66666", "cellSignalStrengthLte.getAsuLevel()\t" + cellSignalStrengthLte.getAsuLevel() );
                        Log.e("66666", "cellSignalStrengthLte.getCqi()\t" + cellSignalStrengthLte.getCqi() );
                        Log.e("66666", "cellSignalStrengthLte.getDbm()\t " + cellSignalStrengthLte.getDbm() );
                        Log.e("66666", "cellSignalStrengthLte.getLevel()\t " + cellSignalStrengthLte.getLevel() );
                        Log.e("66666", "cellSignalStrengthLte.getRsrp()\t " + cellSignalStrengthLte.getRsrp() );
                        Log.e("66666", "cellSignalStrengthLte.getRsrq()\t " + cellSignalStrengthLte.getRsrq() );
                        Log.e("66666", "cellSignalStrengthLte.getRssnr()\t " + cellSignalStrengthLte.getRssnr() );
                        Log.e("66666", "cellSignalStrengthLte.getTimingAdvance()\t " + cellSignalStrengthLte.getTimingAdvance() );
                    }
                }
            }
        }
    }

北京聯通4 G信号を用いて実験を行い、印刷ログは以下の通りである.
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getAsuLevel()	46
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getCqi()	2147483647
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getDbm()	 -94
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getLevel()	 4
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getRsrp()	 -94
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getRsrq()	 -18
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getRssnr()	 2147483647
12-14 09:30:06.667 25776-25776/com.example.data.rssi E/66666: cellSignalStrengthLte.getTimingAdvance()	 2147483647

携帯電話の信号強度機能を取得--実現!