在android中漫游检测

时间:2010-03-03 18:10:52

标签: android

我正在尝试检测漫游激活何时发生。到目前为止,我已经使用了以下代码,但由于我无法测试它,我不知道它的正确性

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);

我写过这个,认为为了首先激活漫游,信号单元必须改变。请告诉我,我的扣除是否正确,如果不是,我怎么能做到这一点。

6 个答案:

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

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java

CDMA LTE

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java

GSM

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

检查方法 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解决方案(在接受的答案中)具有相同的问题:

  1. 我正在侦听DATA网络状态的变化。如果用户没有建立数据连接(例如,他们只是语音漫游),那么它将无法正常工作,但我不认为这是一个问题,因为我们大多数人都希望检测数据漫游(例如我们的应用程序没有在用户漫游时不使用数据。

  2. 我不确定用户开始漫游时数据连接状态是否一定有变化 - 这只是我的理论,如果有人知道的话,我会有兴趣听听。

  3. 最后,让我补充说,有可能听到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());