如何仅为我的应用程序以编程方式禁用移动数据

时间:2014-06-26 13:32:09

标签: android networking

我正在开发一款应用,我担心用户可以在自己之间传输的数据量。由于一些用户的移动数据计划有限,而有些用户没有,我想知道是否可以开发一个开关来禁用我的特定应用的移动数据。 有点像Android自己的数据使用 - >移动 - >应用 - >"限制背景数据"确实...

它说(并且确实)它只能在移动数据网络上禁用后台数据。如果可用的话,将使用Wi-Fi。",我想要但不仅仅是在背景上。

我知道我无法更改"限制背景数据"选项,因为如果应用程序可以取消它,它会使它变得无用......但有没有一种方法我可以通过编程方式说现在我的应用程序被阻止访问移动数据,现在它不是吗?

作为我想要这个的原因的洞察力,我试图在用户选择给定选项(我做了并且工作)时不调用远程访问调用,但是有一些数据泄漏(每天一些kbs)我不能似乎阻止...要么由于系统保持http连接或其他一些模糊的原因......

我在我的应用程序的网络统计数据上看到这些数据在DDMS透视图上的eclipse传输。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

不是禁用,最好检查活动连接是否为wifi,如果不是wifi,则不要进行任何服务器端通信。

检查以下线程,例如。

How do I see if Wi-Fi is connected on Android?

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (mWifi.isConnected()) {
    // Do whatever
}

记得添加

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

到您的AndroidManifest.manifest,以便工作。

答案 1 :(得分:0)

以下禁用或启用移动数据的代码: -

java代码

private void setMobileDataEnabled(Context context, boolean enabled) {
    final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final Class conmanClass = Class.forName(conman.getClass().getName());
    final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
    iConnectivityManagerField.setAccessible(true);
    final Object iConnectivityManager = iConnectivityManagerField.get(conman);
    final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
    final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
    setMobileDataEnabledMethod.setAccessible(true);

    setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}

清单

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