BroadcastReceiver用于网络运营商更改的Intent过滤器

时间:2015-07-30 17:59:35

标签: android android-intent broadcastreceiver

在此之前我想说我确实搜索了这个。 我的目标是检测智能手机是否正在漫游以触发对用户的通知。我希望在设备切换到外国人移动服务提供商时触发通知。

我的第一个想法是使用适当的意图过滤器注册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卡时,此操作永远不会被触发。

我需要采取行动吗?

1 个答案:

答案 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