当手机进出接待区时,我试图让我的广播接收器发射。问题是当小区接收改变时接收器永远不会被呼叫。 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();
}
}
任何见解都会很棒。我一直在敲打这个问题。
谢谢!
答案 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 =电话无线电明确关闭。