2013-08-07 91 views
1

在我的應用程序中,我有兩個切換按鈕,一個用於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(); 
       } 
      } 

     }); 

,併爲移動數據

回答

1

這個你爲什麼要使用反射類?如果我是谷歌,我不是,我會在API中加入保護措施,這樣人們就不能對低層次系統使用反思。允許對這種東西進行反思會使系統如此脆弱以至於沒有人能夠使用它。

如果你看看source tree,你會發現IConnectivityManager甚至不是java類,它是一個aidl資源,這意味着它可能由本地代碼(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) { 
    } 
} 

我還沒有使用它,但爲什麼試圖破解底層服務,而不僅僅是使用它?

+0

如果您有任何其他想法,我又怎麼能對移動數據的切換按鈕爲2.3+版本,請告訴我... –

0

你可以試試this,它適用於KitKat。

public boolean invokeMethod(String methodName, Object[] args) throws Exception { 
    ConnectivityManager mcm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    Class ownerClass = mcm.getClass(); 
    Class[] argsClass = null; 
    if (args != null) { 
     argsClass = new Class[1]; 
     argsClass[0] = args.getClass(); 
    } 
    Method method = ownerClass.getMethod(methodName, argsClass); 
    return (Boolean)method.invoke(mcm, args); 
} 

public Object invokeBooleanArgMethod(String methodName, boolean value) throws Exception { 
    ConnectivityManager mcm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    Class ownerClass = mcm.getClass(); 
    Class[] argsClass = new Class[1]; 
    argsClass[0] = boolean.class; 
    Method method = ownerClass.getMethod(methodName,argsClass); 
    return method.invoke(mcm, value); 
} 

/* use these two method like these */ 
Object[] arg = null; 
try { 
    boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg); 
    if(!isMobileDataEnable){ 
     invokeBooleanArgMethod("setMobileDataEnabled", true); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

此外,在AndroidManifest.xml,你需要添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>