以编程方式启用和禁用移动数据的最新更新[重复]

Posted

技术标签:

【中文标题】以编程方式启用和禁用移动数据的最新更新[重复]【英文标题】:Latest update on enabling and disabling mobile data programmatically [duplicate] 【发布时间】:2015-09-16 04:13:46 【问题描述】:

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

我一直在谷歌上搜索有关能够在应用内启用和禁用移动数据的最新信息(如果 wifi 不可用)。

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

我引用了一个答案:

从来没有针对它的 API。开发人员通过反射调用该方法来使用解决方法。 Google 所做的只是关闭了这个“漏洞”。

还有这样的讨论:

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

这里有这些问题:

How to disable Mobile Data on android

这是在 2010 年提出的,最新的答案是在 2014 年 12 月更新的。

Enable/disable data connection in android programmatically

这是 2012 年公认的答案。

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

还能做吗?

【问题讨论】:

***.com/questions/26539445/… @Heyyou 看起来不可能了。充其量你可以检测它是否打开,然后通过将用户带到设置页面来提示用户打开它 ***.com/a/27198925/2378691 转到此答案的更新 3。它有助于打开/关闭棒棒糖上的移动数据。 【参考方案1】:

由于他们添加了MODIFY_PHONE_STATE 权限检查,因此它无法在非 root 手机上运行。此权限仅授予系统或签名应用refer-here。

从PhoneInterfaceManager查看下面的代码:

   @Override
   public void setDataEnabled(boolean enable) 
       enforceModifyPermission();
       mPhone.setDataEnabled(enable);
   
   private void enforceModifyPermission() 
       mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
   

【讨论】:

@YvetteColomb 我知道这是旧的,但现在还是这样吗?签名应用程序也意味着如果它有一个签名的apk,它可以在没有root手机的情况下工作? 那么通知面板的自定义主题应用程序如何通过自己设计的按钮启用移动数据。他们需要电话、通知和访问权限。您可以在 Play 商店中查看 Power Shader 应用程序。【参考方案2】:

除非您的手机已root,否则我认为您不能以编程方式启用和禁用数据,因为为此我们必须包含仅授予系统或签名应用程序的 MODIFY_PHONE_STATE 权限。

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

【讨论】:

【参考方案3】:

快进到 2018 年底...

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

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

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

2019 年编辑:

上面的答案在 API 28 上不起作用。这是有效的:

Intent intent = new Intent(Settings.ACTION_DATA_USAGE_SETTINGS);
startActivity(intent);

【讨论】:

你在哪个api级别上测试过? Android 9 - API 28 是的,已确认。它不适用于 API 28。我将在完成测试后立即修改我的答案。谢谢。 我添加了适用于 API 28 的内容。请查看修改后的答案。 @kAliert MIUI 11 有什么问题。MIUI 有什么具体的解决方法吗?【参考方案4】:

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

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


【讨论】:

【参考方案5】:

简单的方法。

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
    

【讨论】:

正如其他答案中提到的,这在以后的android版本中不再通过反射提供。 正如其他回复中提到的,这不再允许在 android 非 root 设备上

以上是关于以编程方式启用和禁用移动数据的最新更新[重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式启用/禁用捏合以放大 WKWebView 和 viewForZoomingInScrollView

以编程方式禁用/启用网络接口

以编程方式禁用/启用通知

如何以编程方式启用和禁用振动模式

如何以编程方式禁用/启用UIBarButtonItem

如何在 iOS 中以编程方式禁用/启用睡眠模式?