有关以编程方式启用和禁用移动数据的最新更新

Yve*_*omb 38 android android-permissions

虽然这是一个"重复",但目前的答案已经过时,而且大部分都不再适用.我认为如果可能的话,在这里提供一个更新的资源,以节省人们的时间,就像我刚刚做的那样研究这个问题.

我一直在谷歌上搜索有关能够在应用程序内启用和禁用移动数据的最新信息(如果无法使用wifi).

这是我能找到的最新内容之一:
你知道你不能再从一个小部件中禁用/启用棒棒糖上的数据吗?

有一个答案,我引述:

从来没有一个API.开发人员通过Reflection调用方法来使用解决方法.谷歌所做的一切都是关闭这个"利用".

还有这个讨论:

替换setMobileDataEnabled()api
这是2015年2月.

这里有这些问题:

如何在Android上禁用移动数据

这在2010年被问到,最新的答案在2014年12月更新了一个班轮.

以编程方式在android中启用/禁用数据连接

这就是2012年接受的答案.

这个问题的最新消息是什么?

它还能完成吗?

rup*_*ain 15

它不会在非root用户手机上工作,因为他们添加了MODIFY_PHONE_STATE权限检查.此权限仅适用于此处引用的系统或签名应用程序.

PhoneInterfaceManager检查以下代码:

   @Override
   public void setDataEnabled(boolean enable) {
       enforceModifyPermission();
       mPhone.setDataEnabled(enable);
   }
   private void enforceModifyPermission() {
       mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
   }
Run Code Online (Sandbox Code Playgroud)


小智 14

除非您有root电话,否则我认为您不能以编程方式启用和禁用数据,因为为了这样做,我们必须包含MODIFY_PHONE_STATE权限,该权限仅授予系统或签名应用程序.

setMobileDataEnabled()方法不再可以通过反射调用.它可以通过反射从Android 2.1(API 7)到Android 4.4(API 19)进行调用,但是从Android 5.0及更高版本开始,即使使用root用户手机,该setMobileDataEnabled()方法也无法调用.


Ari*_*Roy 9

我使用的解决方法仅适用于root手机.

setMobileDataEnabled方法已从ConnectivityManager两种方法中删除,getDataEnabledsetDataEnabled添加TelephonyManager到此功能中.

public void setMobileDataState(boolean mobileDataEnabled)
{
    try
    {
        TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);

        if (null != setMobileDataEnabledMethod)
        {
            setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Error setting mobile data state", ex);
    }
}

public boolean getMobileDataState()
{
    try
    {
        TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");

        if (null != getMobileDataEnabledMethod)
        {
            boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);

            return mobileDataEnabled;
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Error getting mobile data state", ex);
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是您需要将此权限(MODIFY_PHONE_STATE)添加到Manifest文件,否则您将获得SecurityException.


use*_*104 8

快进到2018年底...

简短的答案是,不再允许以编程方式启用/禁用移动数据。这是我一直使用的解决方案。

此代码将打开系统数据使用设置屏幕,用户可以在其中手动禁用移动数据。

public void enableDisableMobileData() {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName(
        "com.android.settings", 
        "com.android.settings.Settings$DataUsageSummaryActivity"));
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

编辑2019:

上面的答案不适用于API28。这是起作用的:

Intent intent = new Intent(Settings.ACTION_DATA_USAGE_SETTINGS);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)