TelephonyManager.getAllCellInfo返回Null或不显示任何内容

问题描述

我遇到getAllCellInfo()的问题。

应用具有所需的权限:

这是我的代码

1- 侦听器

private PhonestateListener mPhonestateListener = new PhonestateListener() {
        @TargetApi(Build.VERSION_CODES.M)
        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);

2- SignalStrength中的信息

TextView comparisonText = (TextView) findViewById(R.id.textViewComparison);
            Object ssFieldValueRsrp = null;
            Object ssFieldValueRsrq = null;
            Object ssFieldValueRSSnr = null;
            Object ssFieldValueCqi=null;
            try {
                Field privateStringSsFieldRSRQ = SignalStrength.class.getDeclaredField("mLteRsrq");
                Field privateStringSsFieldRSRP = SignalStrength.class.getDeclaredField("mLteRsrp");
                Field privateStringSsFieldRSSnr = SignalStrength.class.getDeclaredField("mLteRSSnr");
                Field privateStringSsFieldCqi = SignalStrength.class.getDeclaredField("mLteCqi");

                privateStringSsFieldRSRQ.setAccessible(true);
                ssFieldValueRsrq = privateStringSsFieldRSRQ.get(signalStrength);

                privateStringSsFieldRSRP.setAccessible(true);
                ssFieldValueRsrp = privateStringSsFieldRSRP.get(signalStrength);

                privateStringSsFieldRSSnr.setAccessible(true);
                ssFieldValueRSSnr = privateStringSsFieldRSSnr.get(signalStrength);

                privateStringSsFieldCqi.setAccessible(true);
                ssFieldValueCqi = privateStringSsFieldCqi.get(signalStrength);


            } catch (NoSuchFieldException ex) {
            } catch (illegalaccessexception x) {
            }
            String ssRsrp = Integer.toString((int) ssFieldValueRsrp);
            String ssRsrq = Integer.toString((int) ssFieldValueRsrq);
            String ssRSSnr = Integer.toString((int) ssFieldValueRSSnr);

            String ssCqi = Integer.toString((int) ssFieldValueCqi);

            String headerString = "Info from \"SignalStrength\":";
            SpannableString spannableHeaderString = new SpannableString(headerString);
            spannableHeaderString.setSpan(new Underlinespan(),spannableHeaderString.length(),0);

            comparisonText.setText(spannableHeaderString);
            comparisonText.append
                    (
                            "\nRSRP: " + ssRsrp
                                    + "\nRSRQ: " + ssRsrq
                                    +"\nCQI: "+ ssCqi
                            +"\nRSSNR: "+ ssRSSnr
                    );

3-来自CellSignalStrengthLte的信息

Location loc = lm.getLastKNownLocation(LocationManager.GPS_PROVIDER);
            List<android.telephony.CellInfo> infor = tm.getAllCellInfo();
            for (android.telephony.CellInfo info : infor)
            {
                if (info instanceof CellInfoLte)
                {
                    CellSignalStrengthLte ss = ((CellInfoLte) info).getCellSignalStrength();
                    //theButton.setText( ss.toString());

                    Object fieldValueRSRP = null;
                    Object fieldValueRSRQ = null;
                    Object fieldValueRSSnr = null;
                    Object fieldValueCqi=null;

                    try
                    {
                        Field privateStringFieldRSRQ = CellSignalStrengthLte.class.getDeclaredField("mRsrq");
                        Field privateStringFieldRSRP = CellSignalStrengthLte.class.getDeclaredField("mRsrp");
                        Field privateStringFieldCqi = CellSignalStrengthLte.class.getDeclaredField("mCqi");
                        Field privateStringFieldRSSNR = CellSignalStrengthLte.class.getDeclaredField("mRSSnr");

                        privateStringFieldRSRQ.setAccessible(true);
                        fieldValueRSRQ = privateStringFieldRSRQ.get(ss);

                        privateStringFieldRSRP.setAccessible(true);
                        fieldValueRSRP = privateStringFieldRSRP.get(ss);

                        privateStringFieldRSSNR.setAccessible(true);
                        fieldValueRSSnr = privateStringFieldRSSNR.get(ss);

                        privateStringFieldCqi.setAccessible(true);
                        fieldValueCqi = privateStringFieldCqi.get(ss);

                    }
                    catch (NoSuchFieldException ex) {}
                    catch (illegalaccessexception x) {}
                    String rsrp = Integer.toString((int) fieldValueRSRP);
                    String rsrq = Integer.toString((int) fieldValueRSRQ);

                    String RSSnr = Integer.toString((int) fieldValueRSSnr);
                    String cqi = Integer.toString((int) fieldValueCqi);

                    headerString = "Info from \"CellSignalStrengthLte\":";
                    spannableHeaderString = new SpannableString(headerString);
                    spannableHeaderString.setSpan( new Underlinespan(),0);

                    theText.setText
                    (
                        "\nAltitude: " + loc.getAltitude() + "\n\n"+loc.getLongitude()+"\n\n"+loc.getLatitude()+"\n\n"
                    );
                    theText.append(spannableHeaderString);
                    theText.append
                    (
                        "\nRSRP: " + rsrp
                        + "\nRSRQ: " + rsrq
                                + "\nCQI: " + cqi
                                + "\nRSSNR: " + RSSnr
                    );
                }
            }

华为Y6II:棉花糖(android 6):

应用运行平稳,但功能被跳过

enter image description here

华为Nova3i(Android 9)

应用在List<android.telephony.CellInfo> infor = tm.getAllCellInfo();

上使用空指针崩溃

Samsun S10(android 9)

应用运行正常

enter image description here

解决方法

已解决:

此问题与某些双SIM卡手机有关