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.
我试图在 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.