我想知道移动网络是启用还是禁用。
我的应用程序旨在帮助用户接听电话,为此我需要访问Internet。因此,如果Wi-Fi具有睡眠策略且移动网络被禁用,我想在用户首次访问应用程序时显示信息框。 (电话开始响铃后,我需要在几毫秒内上网。)
我找到了Settings.System.WIFI_SLEEP_POLICY,但我找不到有关如何检查移动网络是否被禁用的任何信息(当Wi-Fi开启并正常工作时)。
任何帮助将不胜感激!
编辑: 问题是我想知道用户是否关闭了移动网络(当时手机可能有WiFi接入)。
答案 0 :(得分:18)
我终于找到了解决方案。显然并非所有手机都有此选项:
主页>菜单>设置>无线&网络>移动网络(复选框)
然而,对于那些做的人,这种方法将起作用:
/**
* @return null if unconfirmed
*/
public Boolean isMobileDataEnabled(){
Object connectivityService = getSystemService(CONNECTIVITY_SERVICE);
ConnectivityManager cm = (ConnectivityManager) connectivityService;
try {
Class<?> c = Class.forName(cm.getClass().getName());
Method m = c.getDeclaredMethod("getMobileDataEnabled");
m.setAccessible(true);
return (Boolean)m.invoke(cm);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
答案 1 :(得分:3)
显然有一种替代的,更干净的解决方案,然后反思方法:
final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = cm.getActiveNetworkInfo();
int type = networkInfo.getType();
String typeName = networkInfo.getTypeName();
boolean connected = networkInfo.isConnected()
networkInfo.getType()在连接到移动网络时将返回“0” 或通过WIFI连接时为“1”。 networkInfo.getTypeName()将返回 字符串“mobile”或“WIFI”。和networkInfo.isConnected()将告诉您是否有活动连接。
答案 2 :(得分:3)
更新ANDROID 5.0+(API 21 +)
在某些设备上,通过反射调用getMobileDataEnabled
会在Android 5.0+上导致NoSuchMethodException
。因此,在添加到接受的答案时,您可能需要进行第二次检查是否抛出NoSuchMethodException
。
...
catch(NoSuchMethodException e)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
isDataEnabled = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
}
}
答案 3 :(得分:1)
您可以使用以下代码,这适用于所有API版本:
ConnectivityManager cm =
(ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
if(isConnected)
{
if(activeNetwork.getType()==ConnectivityManager.TYPE_MOBILE)
return true;
else
return false;
}
else
return false;
答案 4 :(得分:0)
PackageManager pm = context.getPackageManager();
boolean hasTelephony = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);