Java 获取当前/状态更改的单元格信号强度。onStateSignalChanged从未调用

Java 获取当前/状态更改的单元格信号强度。onStateSignalChanged从未调用,java,android,Java,Android,目标:获取当前/状态更改的单元格信号强度 问题:阅读(这里和developer.android网站上)让我想到了这段代码。但它不起作用。我的意思是,我试图在SignalStrengthChanged的回调调用上设置断点,但从未调用过。 我还声明了android清单上的粗略位置权限(对于getAllCellInfo()是必需的) 问题: 1) 为什么从未调用SignalStrengthChanged上的 2) 我设想,上述回调将在信号强度改变时被调用。但是,如何在信号变化之前获得当前的信号强度呢

目标:获取当前/状态更改的单元格信号强度

问题:阅读(这里和developer.android网站上)让我想到了这段代码。但它不起作用。我的意思是,我试图在SignalStrengthChanged的回调调用上设置断点,但从未调用过。 我还声明了android清单上的粗略位置权限(对于
getAllCellInfo()
是必需的)

问题:

1) 为什么从未调用SignalStrengthChanged上的

2) 我设想,上述回调将在信号强度改变时被调用。但是,如何在信号变化之前获得当前的信号强度呢

@Override
        protected void onCreate(Bundle savedInstanceState) {
 telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
            telephonyManager.listen(new PhoneStateListener(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}

public void onSignalStrengthsChanged(SignalStrength signalStrength){
            try{
                int level;

                for (final CellInfo info : telephonyManager.getAllCellInfo() ){

                    if (info instanceof CellInfoGsm) {
                        final CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
                        // do what you need
                        level = gsm.getLevel();
                        Toast.makeText(getApplicationContext(), "gsm rssi"+level, Toast.LENGTH_LONG).show();
                    } else if (info instanceof CellInfoCdma) {
                        final CellSignalStrengthCdma cdma = ((CellInfoCdma) info).getCellSignalStrength();
                        // do what you need
                        level = cdma.getLevel();
                        Toast.makeText(getApplicationContext(), "cdma rssi"+level, Toast.LENGTH_LONG).show();
                    } else if (info instanceof CellInfoLte) {
                        final CellSignalStrengthLte lte = ((CellInfoLte) info).getCellSignalStrength();
                        // do what you need
                        level = lte.getLevel();
                        Toast.makeText(getApplicationContext(), "lte rssi"+level, Toast.LENGTH_LONG).show();
                    } else {
                        throw new Exception("Unknown type of cell signal!");
                    }


                }

            }
            catch (Exception e) {

            }

        }

首先全局定义以下提到的变量:

TelephonyManager telephonyManager;
MyPhoneStateListener psListener;
TextView txtSignalStr;
onCreate
方法:

@Override
protected void onCreate(final Bundle savedInstanceState) {
 psListener = new MyPhoneStateListener();
 telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 telephonyManager.listen(psListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
创建一个内部类,该类将扩展
PhoneStateListener

并在更改信号强度之前使用
@Override
注释,方法如下

创建
MyPhoneStateListener
类:

public class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength)
{
 super.onSignalStrengthsChanged(signalStrength);
//your Code
 }
}

您不会传入新的PhoneStateListener。传入一个子类,该子类实现onSignalStrengthChanged。它是一个回调接口。仅在您自己的类中定义该函数没有任何作用(除非您传入该函数并让您的类实现PhoneStateListener),对于noob qeustion…那么我可以在我的mainActivity类中使用内部类吗?是的,您可以在mainActivity类中使用内部类。我刚刚尝试过,但仍然从未调用回调。我想是因为我正在使用usb电缆在固定位置进行调试,所以我尝试四处查看我在回调中插入的Toast,但什么也没有出现。请告诉你的手机Android版本如果你的Android版本大于或等于6,请添加动态权限。而且这个代码在我的手机上运行得很好。