ACTION_PHONE_STATE_CHANGED 网络小区更改时未调用

ACTION_PHONE_STATE_CHANGED not called on network cell changes

我试图在 phone 进出接收区时触发我的广播接收器。问题是当小区接收发生变化时,接收器永远不会被调用。 BroadcastReceiver 可以很好地获取 phone 呼叫状态(呼叫空闲、开始等...),也可以打开和关闭飞行模式,因为广播接收器处理这两种情况。

我在清单中向接收器添加了权限和意图过滤器,它们工作正常。

这是我的 BroadcastReceiver 和 PhoneStateListener。

public class PhoneStateReceiver extends BroadcastReceiver {

private PhoneStateListener mListener = new ServiceStateListener();
private TelephonyManager mTelephonyManager;
private Context mContext;
/**
 * TODO add some sort of call back interface to allow for different uses of this phone state receiver
 */

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    mContext = context;
    if (action.intern().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
        boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
        if (!isAirplaneModeOn) {
            SmsRetryManager.getInstance().retryAllSms(context);
        }
    } else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
        mTelephonyManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        Toast.makeText(mContext, "Receiver registered!", Toast.LENGTH_LONG).show();
        mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_SERVICE_STATE);
        mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
    }
}


public void onDestroy() {
    mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_NONE);
}

private class ServiceStateListener extends PhoneStateListener {

    @Override
    public void onServiceStateChanged (ServiceState serviceState) {
        super.onServiceStateChanged(serviceState);
        boolean connected = (serviceState.getState() == ServiceState.STATE_IN_SERVICE);
        if (connected) {
            Toast.makeText(mContext, "Connection Gained!", Toast.LENGTH_LONG).show();
            //todo retry sms here
            SmsRetryManager.getInstance().retryAllSms(mContext);

        } else {
            Toast.makeText(mContext, "Connection Lost!", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        Toast.makeText(mContext, "Signal changed - cdma : " + signalStrength.getCdmaDbm() + " gsm : " + signalStrength.getGsmSignalStrength(), Toast.LENGTH_LONG).show();
    }
}

任何见解都会很棒。一段时间以来,我一直在努力解决这个问题。

谢谢!

我假设你正在收听广播android.intent.action.SERVICE_STATE

如果是这样,请尝试使用:

if (TelephonyManager.getnetworkOperator.length()==0) connected=false;

在您的 OnReceive 方法上,了解 phone 是否未连接。它对我来说很好用。

如果此解决方案不起作用,请说明您是如何注册接收器的:它是在 manifest.xml 静态注册的吗?或动态 PackageManager.setComponentEnabledSetting?注意:静态注册会发现receiver在重装app后没有触发,需要添加receiver标签

<intent-filter> <action android:name= "android.intent.action.MY_PACKAGE_REPLACED"/></intent-filter>

您还可以查看 return ServiceState 的值。 看这里http://developer.android.com/reference/android/telephony/ServiceState.html

并检查这些值中的哪些是 returned:

int STATE_EMERGENCY_ONLY = The phone is registered and locked. Only emergency numbers are allowed.

int STATE_IN_SERVICE = Normal operation condition, the phone is registered with an operator either in home network or in roaming.

int STATE_OUT_OF_SERVICE = Phone is not registered with any operator, the phone can be currently searching a new operator to register to, or not searching to registration at all, or registration is denied, or radio signal is not available.

int STATE_POWER_OFF = Radio of telephony is explicitly powered off.