在我的应用中,我有两个切换按钮,一个用于wifi,另一个用于移动数据。当应用程序启动时,如果我的WiFi打开,则切换按钮为ON。但是,如果我的“移动数据”为“开”,则切换按钮未显示该消息,它仍然为灰色(无论WiFi发生了什么情况)。当我按下它时,它变成绿色,并且我的移动数据仍处于打开状态...知道为什么吗?

gprs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                try {
                    turnData(isChecked);  //Klasa za ukljucivanje gprsa
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        });


和移动数据类

void turnData(boolean ON) throws Exception {
Log.i("version:", "Found Gingerbread+");
       final ConnectivityManager conman = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
       final Class conmanClass = Class.forName(conman.getClass().getName());
       final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
       iConnectivityManagerField.setAccessible(true);
       final Object iConnectivityManager = iConnectivityManagerField.get(conman);
       final Class iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
       final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
       setMobileDataEnabledMethod.setAccessible(true);
       setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
}

最佳答案

为什么要为此使用反射?如果我不是Google,那么我会在API中添加保护,以使人们无法在低级系统中使用对F的反射。允许对这种东西进行反射会使该系统非常脆弱,以至于没人能使用它。

如果您查看source tree,您会发现IConnectivityManager甚至不是Java类,它是一个辅助资源,这意味着它可能由本机代码(C / C ++)支持,所以我不知道反射在那里会起作用。

如果您查看要尝试访问的setMobileDataEnabled方法,则该方法在ConnectivityManager源中是公开的。

/**
 * Sets the persisted value for enabling/disabling Mobile data.
 *
 * @param enabled Whether the user wants the mobile data connection used
 *            or not.
 * @hide
 */
public void setMobileDataEnabled(boolean enabled) {
    try {
        mService.setMobileDataEnabled(enabled);
    } catch (RemoteException e) {
    }
}


我还没有使用过它,但是为什么要尝试破解基础服务而不仅仅是使用它呢?

10-01 08:50