繁体   English   中英

要求用户通过Android中的对话框类型警报激活移动网络/ 3G

[英]Ask user to activate Mobile Network/3G via a dialog type alert in Android

我正在开发一个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个问题:

  1. 这将打开一个新活动,而不是打开WiFi的警告对话框样式提示。
  2. 这将打开WiFi而不是移动数据。

有没有人试图提示用户打开他们的移动数据? 我希望它看起来像对话框提示,而不是整个新活动(我认为这是糟糕的用户体验)。 我已经研究了如何以编程方式进行操作,但是,我偶然发现的内容不再适用于Android Lollipop +上的非root用户的设备,并且我不希望用户升级操作系统时冒该应用程序不再运行的风险他们的Android设备。

编辑

我看到了下面评论中发布的链接,并且我已经尝试过:

if(checkForMobileNetworkActive()){
}
else{
    Intent i = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
    startActivity(i);
}

但是它将打开“移动数据/数据漫游设置”作为新活动。 在运行时,它使用户可以选中“移动数据”复选框,然后按“后退”按钮返回到我的应用程序,这并不是一种非常流畅的用户体验。

首先,您必须使用此权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

之后,使用此代码,您可以知道它是否通过移动数据连接到Internet:

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"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM