要求用户通过Android

时间:2016-04-27 12:31:32

标签: 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,而不是移动数据。
  3. 是否有人试图提示用户开启其移动数据?尽可能地,我希望它看起来像对话框提示而不是整个新活动(在我看来这是糟糕的用户体验)。我已经看过如何以编程方式进行操作,但是,我偶然发现的东西不再适用于Android Lollipop +上的非root设备,而且我不想让用户在运行时不再运行应用程序的风险升级其Android设备的操作系统。

    修改

    我在下面的评论中看到了这个链接,我试过这个:

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

    但它会将移动数据/数据漫游设置作为新活动打开。虽然它可以工作,但它允许用户选中移动数据的复选框,然后按后退按钮返回到我的应用程序,这不是一个非常流畅的用户体验。

1 个答案:

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