2011-06-28 47 views
7

有没有办法让Android的移动网络设置值为“仅使用2G网络”?检测“只使用2G网络”设置

正在开发的应用程序可以测量某个位置的网络速度,但为了使其与此相关,它必须知道用户是否有意将移动互联网限制为2G。

我查看了ConnectivityManager,但它只提供有关后台数据设置或所有网络的信息。通过他们迭代表明,尽管已启用该设置,HSPA和UMTS返回trueisAvailable()

for (NetworkInfo netInfo : cm.getAllNetworkInfo()) { 
    Log.i(TAG, netInfo.getSubtypeName() + ": " + netInfo.isAvailable()); 
} 

我发现在这一片全部唯一的暗示是,netInfo.getReason()返回“connectionDisabled”在HSPA和UMTS时设置已启用。问题是,当设置被禁用时,这些网络类型不一定会出现在列表中。对于“connectionDisabled”,我特别在HSPA和UMTS上使用字符串比较似乎不太合适。

解决这个问题的正确方法是什么?

+0

在有人尝试从上面的代码片段中获取有意义的信息之前,请不要打扰;我试过了。看起来,当启用“仅2G”模式或只有可用信号是GPRS时,3G网络返回“connectionDisabled”。换句话说,'getReason()'不提供任何有用的信息。 –

+0

[Android issue#8753 address this。](http://code.google.com/p/android/issues/detail?id=8753)我已经尝试了那里提出的建议,但在测试过的设备上,无论实际设置或连接状态如何,Setting.Secure.getInt()总是返回1。 –

+0

后续:问题#8753表明'Settings.Secure.NETWORK_PREFERENCE'反映了这个设置。这个设置没有记录,但是当两个连接都可用时,似乎反映了'TYPE_WIFI'优先于'TYPE_MOBILE',而不是我正在寻找的。 –

回答

5

对于设备(专为LG的Optimus 2X速度,LG-P990)的一小部分,答案似乎是:

int enabled = Settings.Secure.getInt(getContentResolver(), 
     "preferred_network_mode", -1); 
Log.d("MYAPP", "2G only enabled: " + enabled); 

凡“仅使用2G网络”被指定为设置:

  • 0表示设置被禁用
  • 1表示启用该设置
  • -1指示设置未设置(有些设备?)

我如何被发现的?我用我收集了所有键/值对从Settings.Secure如下:

ContentResolver cr = getContentResolver(); 
Cursor cursor = cr.query(Settings.Secure.CONTENT_URI, null, null, null, null); 
if (cursor.moveToFirst()) { 
    while (!cursor.isAfterLast()) { 
     Log.d("MYAPP", "cursor: " 
       + cursor.getString(0) + ", " 
       + cursor.getString(1) + ", " 
       + cursor.getString(2)); 
     cursor.moveToNext(); 
    } 
} 

我比较启用和禁用设置之间的结果,果然我:

07-08 00:15: 20.991:DEBUG/MYAPP(13813):光标:5154,preferred_network_mode,1

不要使用(在上面的例子5154)的索引列,如我注意到它切换设置之间改变。

虽然这与some documentation for Settings.Secure I found online相关,但此值不受所有手机的尊重。

如果您的设备返回-1,则列出键值对可能会显示您需要的设置。请评论,如果你遇到它!

+1

我注意到,HTC和三星设备不显示更喜欢2G网络的特定选项,而是允许用户在GSM(2G/2.5G)或WCDMA(3G/4G)或两者之间进行选择。我还没有找到这个设置。 –

0

据我所知,没有书面的方式获得该设置的价值。但有一个Use2GOnlyCheckBoxPreference类可以用作示例。它使用内部PhonePhoneFactory类来获取当前值prefer_2g设置。

您可以通过反射使用PhonePhoneFactory类。但是,这是没有证据的,并且是你自己承担的风险。下面是从Use2GOnlyCheckBoxPreference相关代码:

import com.android.internal.telephony.Phone; 
import com.android.internal.telephony.PhoneFactory; 

public class Use2GOnlyCheckBoxPreference extends CheckBoxPreference { 

    private Phone mPhone; 
    private MyHandler mHandler; 

    public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mPhone = PhoneFactory.getDefaultPhone(); 
     mHandler = new MyHandler(); 
     mPhone.getPreferredNetworkType(
       mHandler.obtainMessage(MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE)); 
    } 

    private class MyHandler extends Handler { 

     private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0; 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case MESSAGE_GET_PREFERRED_NETWORK_TYPE: 
        handleGetPreferredNetworkTypeResponse(msg); 
        break; 
      } 
     } 

     private void handleGetPreferredNetworkTypeResponse(Message msg) { 
      AsyncResult ar = (AsyncResult) msg.obj; 

      if (ar.exception == null) { 
       int type = ((int[])ar.result)[0]; 
       Log.i(LOG_TAG, "get preferred network type="+type); 
       setChecked(type == Phone.NT_MODE_GSM_ONLY); 
      } else { 
       // Weird state, disable the setting 
       Log.i(LOG_TAG, "get preferred network type, exception="+ar.exception); 
       setEnabled(false); 
      } 
     } 
    } 
} 
+0

如果我理解正确,为了访问'Phone'和'PhoneFactory',我需要使用SDK的源代码,这意味着它将无法工作,除非您可以部署自己的Android发行版。 [我试图通过Java反射来获得'getDefaultPhone()'](http://stackoverflow.com/questions/2143754/can-a-telephony-phone-object-be-instantiated-through-the-sdk) ,但手机需要扎根。我错过了一个窍门让这个工作? –

+0

是的,你是对的。事实证明,你不能使用第三方应用程序中的'PhoneFactory'。 – inazaruk

+0

这不会工作(至少5年后),因为PhoneFactory.makeDefaultPhone()必须先调用PhoneFactory.getDefaultPhone() – BamsBamx