1

我使用此代码在我的应用程序中启用或禁用 Internet 3G 数据。我阅读了几个关于隐藏反射函数的问题,但它在数千部具有不同 android 版本的手机中运行良好(我的应用程序在 PlayStore 中,我没有遇到任何问题)。但我很担心,因为我发现一个人的手机无法做到这一点。让我首先展示我使用的代码:

 try
 {  final ConnectivityManager conman = (ConnectivityManager) MyContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    if(conman == null) return false;
    Class conmanClass = Class.forName(conman.getClass().getName());
    if(conmanClass == null) return false;
    Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
    if(iConnectivityManagerField == null) return false;
    iConnectivityManagerField.setAccessible(true);
    Object iConnectivityManager = iConnectivityManagerField.get(conman);
    if(iConnectivityManager == null) return false;
    Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
    if(iConnectivityManagerClass == null) return false;
    Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
    if(setMobileDataEnabledMethod == null) return false;
    setMobileDataEnabledMethod.setAccessible(true);
    setMobileDataEnabledMethod.invoke(iConnectivityManager, true/false); //Here is where you choose to enable or to disable
    return true; //Everything went OK
 }catch(Exception e)
 {  return false;
 }

错误在行:

Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");

有了这个结果:

java.lang.NoSuchFieldException:mService

那部手机是使用 Jelly Bean 4.1.1 的三星 Galaxy SII 有什么想法吗?我害怕人们开始报告同样的问题。

4

1 回答 1

1

显然,三星(或者可能是 ROM 模组作者)重写了该类并且不再具有名为mService. 这完全在他们的权利范围内。只要他们的更改不会破坏 CTS 涵盖的任何内容,他们就可以对框架类的内部实现做他们想做的事。这就是为什么我和其他 Android 专家告诉开发人员不要依赖像你正在使用的脚本小子技巧。

如果“启用或禁用 Internet 3G 数据”对您的应用程序至关重要,并且您确定这会影响三星 Galaxy SII 上的库存 ROM,您将需要阻止通过 Play 商店分发到此类设备。

如果“启用或禁用 Internet 3G 数据”对您的应用程序并不重要,请添加一个更好的异常处理程序来表示“抱歉,此功能不可用”或类似的内容。

于 2013-03-20T12:39:32.803 回答