以编程方式启用/禁用移动数据(棒棒糖及更高版本)而无需root

时间:2018-09-11 11:46:15

标签: android system

我正在尝试以编程方式在android棒棒糖及更高版本中切换android数据连接,但它无法正常工作并且总是出现异常。

  

这是我的代码

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

1 个答案:

答案 0 :(得分:1)

此方法仅适用于root用户。实际上,由于Lollipop已更新,因此无法以编程方式启用/禁用移动数据。您可以使用以下版本在较低版本上进行操作:

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