有没有办法让Android的移动网络设置值“仅使用2G网络”?
正在开发的应用程序测量某个位置的互联网速度,但为了使其具有相关性,它必须知道用户是否故意将移动互联网限制为2G。
我已经看过ConnectivityManager,但它只提供有关后台数据设置或所有网络的信息。通过它们进行迭代显示,尽管设置已启用,但HSPA和UMTS会为true
返回isAvailable()
:
for (NetworkInfo netInfo : cm.getAllNetworkInfo()) {
Log.i(TAG, netInfo.getSubtypeName() + ": " + netInfo.isAvailable());
}
我在这一切中发现的唯一提示是,当启用该设置时,netInfo.getReason()
在HSPA和UMTS上返回“connectionDisabled”。问题是,当禁用该设置时,这些网络类型根本不一定出现在列表中。我认为在HSPA和UMTS上专门使用字符串比较“connectionDisabled”似乎不对。
解决这个问题的正确方法是什么?
答案 0 :(得分:5)
对于一小部分设备(特别是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, 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相关,但所有手机都不会尊重此值。
如果您的设备返回-1
,则列出键值对可能会显示您需要的设置。如果你遇到它请评论!
答案 1 :(得分:0)
据我所知,没有记录的方法可以获得该设置的价值。但是有一个Use2GOnlyCheckBoxPreference
类可以作为一个例子。它使用内部Phone
和PhoneFactory
类来获取prefer_2g
设置的当前值。
您可以通过反思使用Phone
和PhoneFactory
课程。但是因为这是没有证件的,并且你自担风险。以下是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);
}
}
}
}