Android L(5.x)打开/关闭"移动数据"编程

时间:2015-03-30 07:01:48

标签: android android-5.0-lollipop

我需要以编程方式打开/关闭移动数据。下面的代码不适用于5.x.你能帮我么。提前谢谢。

private void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        final ConnectivityManager conman = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
        connectivityManagerField.setAccessible(true);
        final Object connectivityManager = connectivityManagerField.get(conman);
        final Class connectivityManagerClass =  Class.forName(connectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
        setMobileDataEnabledMethod.invoke(connectivityManager, enabled);    }
  

03-30 12:42:29.466:W / System.err(5966):   java.lang.NoSuchMethodException:setMobileDataEnabled [boolean] 03-30   12:42:29.466:W / System.err(5966):at   java.lang.Class.getMethod(Class.java:664)03-30 12:42:29.466:   W / System.err(5966):at   java.lang.Class.getDeclaredMethod(Class.java:626)

java.lang.NoSuchMethodException:setMobileDataEnabled [boolean] @ under line。

  

final方法setMobileDataEnabledMethod =   connectivityManagerClass.getDeclaredMethod(" setMobileDataEnabled&#34 ;,   Boolean.TYPE);

2 个答案:

答案 0 :(得分:4)

  

似乎 setMobileDataEnabled 方法不再存在    ConnectivityManager 并且此功能已移至    TelephonyManager ,有两个方法getDataEnabled和setDataEnabled。

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;
}

执行代码时,您会收到SecurityException,指出用户10089和当前进程都没有android.permission.MODIFY_PHONE_STATE。

应添加权限 MODIFY_PHONE_STATE 我是从Answer得到的 谢谢Muzikant

答案 1 :(得分:2)

在Android L 5.xx中,隐藏的API setMobileDataEnabled 方法已被删除,无法再使用。您可以在/frameworks/base/core/java/android/net/ConnectivityManager.java下的android lolipop源代码中验证这一点。

如果你仍然坚持要执行它,你可以使用Kushal回答的代码片段,但 getDataEnabled 是系统api,普通用户应用程序无法访问。在TelephonyManager下还有一个系统api可用 setDataEnabled 。 (/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)

/** @hide */
@SystemApi
public void setDataEnabled(boolean enable) {
 setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable);
} 

它还需要权限" android.permission.MODIFY_PHONE_STATE"这只适用于有根设备。