在此之前我想说我确实搜索了这个。 我的目标是检测智能手机是否正在漫游以触发对用户的通知。我希望在设备切换到外国人移动服务提供商时触发通知。
我的第一个想法是使用适当的意图过滤器注册BroadcastReceiver,因为我确定操作系统检测到SIM正在漫游时。
根据stackoverflow上的其他帖子,我编写了这个:
在AndroidManifest.xml上
<receiver android:name="(...).RoamingBrocastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
我的RoamingBrocastReceiver类是这样的:
public class RoamingBrocastReceiver extends BroadcastReceiver {
public static final String TAG = RoamingBrocastReceiver.class.getSimpleName();
private NotificationManager mNotificationManager;
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG, "onReceive()");
this.context = context;
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephony.isNetworkRoaming()) {
String notificationTitle = "Sample title";
showNotification(notificationTitle);
String contryIso = telephony.getNetworkCountryIso();
Log.v(TAG, "Roaming is on: country ISO: " + contryIso);
}
}
}
根据我的测试,android.net.conn.CONNECTIVITY_CHANGE操作仅在数据连接发生变化时触发(例如wifi,3g / 4g数据),但从不在网络发生变化时触发。 我已经使用本地和外国人SIM卡进行了一些测试,当我在打开设备的情况下更换Nexus 5上的SIM卡时,此操作永远不会被触发。
我需要采取行动吗?
答案 0 :(得分:0)
您正在使用正确的操作android.net.conn.CONNECTIVITY_CHANGE
。
但要检查漫游使用此
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if(ni != null && ni.isRoaming()) {
// device is in roaming state
}
注意:某些版本似乎存在错误,其中getActiveNetworkInfo()在漫游时返回null。见这里:http://code.google.com/p/android/issues/detail?id=11866