网络单元格更改未调用ACTION_PHONE_STATE_CHANGED

时间:2015-08-11 18:12:57

标签: android broadcastreceiver phone-state-listener

当手机进出接待区时,我试图让我的广播接收器发射。问题是当小区接收改变时接收器永远不会被呼叫。 BroadcastReceiver适用于获取电话呼叫状态(呼叫空闲,启动等等),以及用于启用和关闭飞机模式,因为广播接收器可以处理这两种状态。

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

以下是我的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();
    }
}

任何见解都会很棒。我一直在敲打这个问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

如果此解决方案不起作用,请说明您如何注册接收方:它是否在manifest.xml中静态注册?或者使用PackageManager.setComponentEnabledSetting动态地?注意:使用静态注册,您会发现在重新安装应用程序后未触发接收器,需要添加到接收器标签

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

您还可以查看返回ServiceState的值。 见http://developer.android.com/reference/android/telephony/ServiceState.html

并检查返回了以下哪些值:

  

int STATE_EMERGENCY_ONLY =手机已注册并已锁定。只要   紧急号码是允许的。

     

int STATE_IN_SERVICE =正常运行情况,手机在家庭网络或漫游中向运营商注册。

     

int STATE_OUT_OF_SERVICE =电话未向任何运营商注册,   手机当前正在搜索新的运营商注册,或   根本没有搜索注册,或注册被拒绝,或   无线电信号不可用。

     

int STATE_POWER_OFF =电话无线电明确关闭。