我正在尝试检测漫游激活何时发生。到目前为止,我已经使用了以下代码,但由于我无法测试它,我不知道它的正确性
TelephonyManager telephonyManager = TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener cellLocationListener = new PhoneStateListener() {
public void onCellLocationChanged(CellLocation location) {
if(telephonyManager.isNetworkRoaming()
{
Toast.makeText(getApplicationContext(),"in roaming",Toast.LENGTH_LONG).show();
}
}
};
telephonyManager.listen(cellLocationListener, PhoneStateListener.LISTEN_CELL_LOCATION);
我写过这个,认为为了首先激活漫游,信号单元必须改变。请告诉我,我的扣除是否正确,如果不是,我怎么能做到这一点。
答案 0 :(得分:15)
我认为你想在NetworkInfo类中使用isRoaming()。但首先要注册一个更改广播监听器:
<receiver android:name="YourListener">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
这为您提供了一个操作名称:ConnectivityManager.CONNECTIVITY_ACTION
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
//[edit: check for null]
if(ni != null) {
//...Here check if this is connected and available...
return ni.isRoaming();
}
[编辑:已知问题] 注意:某些版本似乎存在错误,其中getActiveNetworkInfo()在漫游时返回null。见这里:http://code.google.com/p/android/issues/detail?id=11866
我希望这有帮助!
灵光
答案 1 :(得分:14)
如果您想知道是否存在语音漫游,即使接收方由isNetworkRoaming()
触发,您也可以在TelephonyManager中测试android.net.conn.CONNECTIVITY_CHANGE
。
我认为这也可以避免getActiveNetworkInfo()
返回null时的错误。
public class RoamingListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
TelephonyManager telephony =
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephony.isNetworkRoaming())
Toast.makeText(context, "Is on TelephonyM Roaming", Toast.LENGTH_LONG).show();
}
}
答案 2 :(得分:2)
漫游状态发生变化时获取事件的可靠方式是
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onServiceStateChanged(ServiceState serviceState) {
super.onServiceStateChanged(serviceState);
if (telephonyManager.isNetworkRoaming()) {
// In Roaming
} else {
// Not in Roaming
}
// You can also check roaming state using this
if (serviceState.getRoaming()) {
// In Roaming
} else {
// Not in Roaming
}
}
};
每当检测到漫游状态时,将使用serviceStateChanged方法通知PhoneListener。
我通过查看AOSP源代码证实了这一点。
CDMA
CDMA LTE
GSM
检查方法 pollStateDone(),这是为TelephonyManager设置漫游状态的地方
答案 3 :(得分:0)
在我的情况下,我已经使用TelephonyManager和PhoneStateListener监听网络状态更改,因此,与原始提问者一样,我想知道是否可以在那里检测到漫游事件。
(这将是在接受的答案中使用ConnectivityManager / NetworkInfo解决方案的替代方案。)
为了检测变化,原始问题建议监听小区位置的变化,但我想知道这是否会导致更多事件发生。
我认为只有在网络状态发生变化时才能改变漫游状态。
protected PhoneStateListener psl = new PhoneStateListener() {
public void onDataConnectionStateChanged(int state, int networkType) {
if (TelephonyManager.DATA_CONNECTED == state)
isRoaming = teleman.isNetworkRoaming();
// teleman is an instance of TelephonyManager
}
}
public static final int pslEvents = PhoneStateListener.LISTEN_DATA_CONNECTION_STATE;
TelephonyManager teleman = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
teleman.listen( psl, pslEvents );
此方法有两个注意事项,但我认为ConnectivityManager解决方案(在接受的答案中)具有相同的问题:
我正在侦听DATA网络状态的变化。如果用户没有建立数据连接(例如,他们只是语音漫游),那么它将无法正常工作,但我不认为这是一个问题,因为我们大多数人都希望检测数据漫游(例如我们的应用程序没有在用户漫游时不使用数据。
我不确定用户开始漫游时数据连接状态是否一定有变化 - 这只是我的理论,如果有人知道的话,我会有兴趣听听。
最后,让我补充说,有可能听到PhoneStateListener :: onServiceStateChanged()可能是所有的最佳解决方案:简单和最少的不必要的事件(这应该很少被触发)但我发现文档含糊不清无法判断PSL事件是否因任何ServiceState对象属性的更改(例如包括漫游)而触发,或者只是为ServiceState的服务状态属性而触发。
答案 4 :(得分:0)
借助Android 5.1更新,现在可以轻松实现漫游检测:只需使用SubscriptionManager并从SubscriptionInfo getDataRoaming()获取漫游信息即可。如果有多个SIM,则只返回活动的信息,这很方便。
答案 5 :(得分:-2)
这完全没有任何lisstener 1用于漫游,0用于非漫游
try {
int roaming= Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING);
Log.e("roaming","roaming"+roaming);
}
catch (Exception e)
{
Log.e("Exception","Exception"+e.getLocalizedMessage());