为了账号安全,请及时绑定邮箱和手机立即绑定

从Android L及更高版本开始,setMobileDataEnabled方法不再可调用

从Android L及更高版本开始,setMobileDataEnabled方法不再可调用

慕田峪9158850 2019-08-16 14:36:03
从Android L及更高版本开始,setMobileDataEnabled方法不再可调用我已经向Google报告了问题78084,因为该setMobileDataEnabled()方法不再可以通过反射调用。它可以通过反射从Android 2.1(API 7)到Android 4.4(API 19)进行调用,但是从Android L及更高版本开始,即使使用root,该setMobileDataEnabled()方法也不可调用。官方回应是问题是“已关闭”,状态设置为“WorkingAsIntended”。谷歌的简单解释是:私有API是私有的,因为它们不稳定,可能会在没有通知的情况下消失。是的,谷歌,我们意识到使用反射调用隐藏方法的风险 - 甚至在Android出现之前 - 但是你需要提供一个更加可靠的答案,如果有的话,可以实现相同的结果setMobileDataEnabled()。(如果您对我的决定感到不满,请登录问题78084,并尽可能多地将其加注,让Google知道他们的错误。)所以,我的问题是:在Android设备上以编程方式启用或禁用移动网络功能时,我们是否处于死胡同?谷歌的这种严厉的方法在某种程度上并不适合我。如果您有Android 5.0(Lollipop)及其他方法的解决方法,我很乐意听到您在此主题中的回答/讨论。我使用下面的代码来查看该setMobileDataEnabled()方法是否可用:final Class<?> conmanClass = Class.forName(context.getSystemService(Context.CONNECTIVITY_SERVICE).getClass().getName());final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");iConnectivityManagerField.setAccessible(true);final Object iConnectivityManager = iConnectivityManagerField.get(context.getSystemService(Context.CONNECTIVITY_SERVICE));final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());final Method[] methods = iConnectivityManagerClass.getDeclaredMethods();for (final Method method : methods) {     if (method.toGenericString().contains("set")) {         Log.i("TESTING", "Method: " + method.getName());     }}但事实并非如此。更新:目前,如果设备已植根,则可以切换移动网络。但是,对于非根设备,它仍然是一个调查过程,因为没有通用的方法来切换移动网络。
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

我注意到ChuongPham发布的服务调用方法并不能在所有设备上保持一致。

我发现以下解决方案,我认为在所有ROOTED设备上都可以正常工作。

通过su执行以下操作

启用移动数据

svc data enable

禁用移动数据

svc data disable

我认为这是最简单和最好的方法。

编辑:2个downvotes是我认为是商业原因。这个人现在删除了他的评论。自己动手吧,它有效!在评论中也确认了由男性工作。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 894 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信