有没有办法让
Android的移动网络设置的价值为“仅使用2G网络”?
正在开发的应用程序测量某个位置的互联网速度,但为了使其相关,它必须知道用户是否故意将移动互联网限制为2G.
我已经看过ConnectivityManager,但它只提供有关后台数据设置或所有网络的信息.通过它们进行迭代显示,尽管设置已启用,但HSPA和UMTS对isAvailable()返回true:
for (NetworkInfo netInfo : cm.getAllNetworkInfo()) { Log.i(TAG,netInfo.getSubtypeName() + ": " + netInfo.isAvailable()); }
我在这一切中发现的唯一提示是,当启用该设置时,netInfo.getReason()在HSPA和UMTS上返回“connectionDisabled”.问题是,当禁用该设置时,这些网络类型根本不一定出现在列表中.对于我来说,使用HSPA和UMTS上的字符串比较来表示“connectionDisabled”似乎并不合适.
解决方法
对于一小部分设备(特别是LG Optimus 2X Speed,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); 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): cursor: 5154,preferred_network_mode,1
不要使用索引列(上例中的5154),因为我注意到它在切换设置之间发生了变化.
虽然这与some documentation for Settings.Secure I found online相关,但并非所有手机都尊重此值.