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

时间:2015-06-29 15:47:46

标签: android android-permissions

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

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

这是我能找到的最新内容之一:
Did you know you can no longer Disable/Enable Data on lollipop from a widget?

有一个答案,我引用:

  

它从来没有API。开发人员通过Reflection调用方法来使用解决方法。谷歌所做的就是关闭这个“利用”。

还有这个讨论:

Replacement for setMobileDataEnabled() api
这是2015年2月。

这里有这些问题:

How to disable Mobile Data on Android

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

Enable/disable data connection in android programmatically

这就是2012年接受的答案。

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

还能完成吗?

6 个答案:

答案 0 :(得分:15)

它不会在非root 手机上工作,因为他们添加了MODIFY_PHONE_STATE权限检查。此权限仅授予系统或签名应用引用 - here

PhoneInterfaceManager

检查以下代码
   @Override
   public void setDataEnabled(boolean enable) {
       enforceModifyPermission();
       mPhone.setDataEnabled(enable);
   }
   private void enforceModifyPermission() {
       mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
   }

答案 1 :(得分:11)

我使用仅适用于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;
}

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

答案 2 :(得分:10)

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

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

答案 3 :(得分:4)

快进到2018年底...

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

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

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

答案 4 :(得分:1)

简便方法。

public void setMobileDataState(boolean mobileDataEnabled)
{
    try{
        ConnectivityManager dataManager;
        dataManager  = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
        dataMtd.setAccessible(true);
        dataMtd.invoke(dataManager, mobileDataEnabled);
    }catch(Exception ex){
        //Error Code Write Here
    }
}

答案 5 :(得分:1)

以上都不适合我,但如果您的设备已植根,则可以使用它来启用它。

private void enableMobileData(){

        try {
            String[] cmds = {"svc data enable"};
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

}

禁用此功能:

private void disableMobileData(){

    try {
        String[] cmds = {"svc data disable"};
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        for (String tmpCmd : cmds) {
            os.writeBytes(tmpCmd + "\n");
        }
        os.writeBytes("exit\n");
        os.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }

}