【问题标题】:Detecting when roaming is turned off in Android在Android中检测何时关闭漫游
【发布时间】:2012-09-26 06:27:08
【问题描述】:

我创建了一个BroadcastReceiver 来监听CONNECTIVITY_CHANGE 事件。现在,我只需打印出调用BroadcastReceiverIntent 及其附加功能的操作。我在马尼拉的办公室使用测试电话,SIM 卡来自丹麦。当onReceive() 被调用时,这就是在LogCat 中打印出来的内容:

action: android.net.conn.CONNECTIVITY_CHANGE
key: extraInfo, value: data.tre.dk
key: htcCurrentActiveNetwork, value: null
key: networkInfo, value: null
key: reason, value: roamingOn
key: noConnectivity, value: null
key: inetCondition, value: null

我需要知道漫游结束时reason 的值是多少——通过猜测可能是roamingOff,但我不能确定,除非我去丹麦。这是因为我需要在漫游服务关闭时执行一项任务,并且我从 LogCat 中注意到CONNECTIVITY_CHANGE 事件被触发的原因不是切换漫游模式。或者有没有更好的方法来检测何时关闭漫游?

广播接收器的代码:

public void onReceive(Context context, Intent intent) {
    Log.d(This.LOGTAG, "action: " + intent.getAction());
    Bundle extras = intent.getExtras();
    for (String key : extras.keySet()) {
        Log.d(This.LOGTAG, "key: " + key + ", value: " + extras.getString(key));
    }
}

清单条目:

<receiver android:name=".listener.RoamingListener">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

【问题讨论】:

    标签: android broadcastreceiver roaming


    【解决方案1】:

    网络漫游和数据漫游是有区别的。

    一般来说,网络漫游允许您的电信公司在您在国外时通过第三方卫星,这样您就可以与他们的服务保持联系。即使您已经告诉您的电信公司您要订阅网络漫游,它也不会被激活,直到您真正开始通过第三方电信卫星连接,并且只有在您实际出国时才会发生这种情况。

    数据漫游只是在您处于网络漫游模式时允许/禁止您的设备使用移动数据。它更依赖于设备,您可以在手机的“设置”应用中轻松打开或关闭它。

    简而言之,如果要检测网络漫游,请使用TelephonyManager.isNetworkRoaming()。如果要检查数据漫游是否打开或关闭,请使用Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING)

    重要提示:我没有亲自测试过以下场景,我不确定isNetworkRoaming() 会返回什么值。

    1. 您没有告诉您的本地电信公司打开网络漫游,但是当您到达其他国家/地区时,手机开始检测其他电信公司网络。
    2. 在方案 1 之后,您的手机会要求您选择要连接到哪个检测到的电信网络。您选择一个,电话会尝试连接。我不知道isNetworkRoaming() 会在这里返回什么值,因为你一开始没有订阅网络漫游。

    【讨论】:

      【解决方案2】:

      您可以简单地使用此行来检测漫游状态:

      Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING)
      

      这不需要任何特殊的权限或接收者。

      Source

      【讨论】:

      • 我刚刚记录了该行的结果以及TelephonyManager.isNetworkRoaming() 的结果。我发现Settings.Secure.DATA_ROAMING 可能返回0(意思是数据漫游已关闭),而isNetworkRoaming()true。我猜这是因为电信公司仍处于网络漫游模式,但我不允许我的设备使用移动互联网。他们好像是不同的交换机,我是在网络漫游模式之后。
      • 你想知道什么?我想TelephonyManager.isNetworkRoaming()表示你正在漫游,设置显示你是否可以在漫游中使用互联网
      • 我选择了网络漫游模式,因为我正在尝试衡量用户的下个月账单——这不仅包括通过数据漫游发送/接收的移动数据量。
      • 好的,使用TelephonyManager.isNetworkRoaming()检测用户是否在漫游。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2016-06-25
      相关资源
      最近更新 更多