【问题标题】:How to disable mobile data programmatically for my app only如何仅以编程方式为我的应用禁用移动数据
【发布时间】:2014-06-26 13:32:09
【问题描述】:

我正在开发一个应用程序,我担心用户之间可以传输的数据量。由于有些用户的移动数据计划有限,有些则没有,我想知道我是否可以开发一个开关来禁用我的特定应用程序的移动数据。 有点像Android自己的Data usage -> mobile -> App ->“Restrict background data”做的……

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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: android networking


    【解决方案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 以使其正常工作。

    【讨论】:

    • 谢谢,我已经做了类似的事情,当Wifi连接或移动数据连接并且没有处于受限模式时,我不与服务器通信,我认为这是“未连接”到互联网状态”,这将数据使用量从可能的几兆字节(取决于使用情况)减少到每天几千字节......但是仍然有这些 kb 困扰着我......因为我不能调用这个开关a “限制移动数据”或“仅 Wi-Fi”模式。我希望可能有一种方法可以强制我的应用(也可以在后台运行)不使用任何移动数据。
    • 您是否在项目中使用任何需要互联网的第三方库,那么很难限制它们。但是如果从您的应用程序中使用互联网,那么这绝对应该像设备连接到网络时一样工作,如果网络不是 wifi,则认为它没有连接。
    • 好的,但他们不会像广告 sdks 那样在那儿工作。据我所知,只有通过检查网络类型 wifi 才能满足您是否使用数据的要求。
    【解决方案2】:

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

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

    【讨论】:

    • 非常有趣,谢谢!但是,这会为所有应用禁用/启用设备的移动数据......并且不仅仅针对我的应用,就像我想做的那样......
    • @Marc 当你关闭应用程序然后你启用它很简单(它关闭所有应用程序)。
    • 我的应用程序也在后台运行,无论哪种方式,我都不想在我的应用程序处于活动状态时向用户强加没有数据连接:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2013-05-21
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多