我正在开发Android应用程序,我需要确保用户以某种方式连接到互联网。我已经可以检查WiFi,但是,不是每个人都会一直在WiFi区域附近,所以我认为移动数据是一个有效的替代方案(当然假设设备能够拥有SIM卡和所有设备)。到目前为止,我可以检查用户是否启用了他或她的移动数据,如下所示:
if(checkForMobileNetworkActive()){
//with mobile active
}
else{ // mobile not active
}
我想要做的是:如果移动网络未激活,我会要求用户将其打开。与我过去所做的非常类似,我提示用户打开蓝牙或位置服务。但是,在线搜索时,大多数答案都指出我打算通过意图打开WiFi设置:
Intent i = new Intent(Settings.ACTION_WIFI_SETTINGS);
startActivity(i);
我对这个解决方案有2个问题:
是否有人试图提示用户开启其移动数据?尽可能地,我希望它看起来像对话框提示而不是整个新活动(在我看来这是糟糕的用户体验)。我已经看过如何以编程方式进行操作,但是,我偶然发现的东西不再适用于Android Lollipop +上的非root设备,而且我不想让用户在运行时不再运行应用程序的风险升级其Android设备的操作系统。
我在下面的评论中看到了这个链接,我试过这个:
if(checkForMobileNetworkActive()){
}
else{
Intent i = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
startActivity(i);
}
但它会将移动数据/数据漫游设置作为新活动打开。虽然它可以工作,但它允许用户选中移动数据的复选框,然后按后退按钮返回到我的应用程序,这不是一个非常流畅的用户体验。
答案 0 :(得分:0)
首先,您必须使用此权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
之后,使用此代码,您可以了解它是否通过移动数据连接到互联网:
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
更新1: 如果要在应用程序中启用/禁用移动网络,可以使用此解决方案:
private void enableMobileData(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(cm.getClass().getName());
final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
connectivityManagerField.setAccessible(true);
final Object connectivityManager = connectivityManagerField.get(cm);
final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
}
不要忘记使用此权限:
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>