2012-07-26 12 views
9

W mojej aplikacji chcę zapewnić użytkownikowi opcję wyboru połączenia Wi-Fi/GPRS do połączenia sieciowego z serwerem WWW. Mogą to być odpowiedzi na następujące pytania rozwiązujące mój problem ... 1. W jaki sposób sprawdzić, czy jest włączona bieżąca domyślna opcja łączności sieciowej. 2. Jak włączyć Wi-Fi/GPRS przy wyborze użytkownika lub (wyłączyć Wi-Fi, jeśli użytkownik wybierze GPRS - jeśli ta opcja będzie wymagana do działania GPRS)Jak zapewnić opcję wyboru połączenia Wi-Fi lub GPRS do połączenia sieciowego w aplikacji Android

czy jest jakiś inny sposób na Zrób to ?

Odpowiedz

15

Spróbuj tego:

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

if (mWifi.isConnected()) 
    //if wifi connected 
} 

ConnectivityManager connManager1 = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
NetworkInfo mMobile = connManager1.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

if (mMobile.isConnected()) { 
    //if internet connected 
} 

Nie zapomnij dodać te uprawnienia w pliku manifestu;

android.permission.CHANGE_WIFI_STATE 
android.permission.ACCESS_WIFI_STATE 
android.permission.UPDATE_DEVICE_STATS 
android.permission.CHANGE_NETWORK_STATE 
android.permission.ACCESS_NETWORK_STATE 
android.permission.MODIFY_PHONE_STATE 
android.permission.READ_PHONE_STATE 

Aby włączyć lub wyłączyć Wi-Fi, należy mWiFi.setWifiEnabled(true|false)

włączyć/wyłączyć GPRS/3G, należy użyć następującego fragmentu kodu.

void turnData(boolean ON) throws Exception 
{ 

if(bv == Build.VERSION_CODES.FROYO) 
{ 

    Log.i("version:", "Found Froyo"); 
    try{ 
     Method dataConnSwitchmethod; 
     Class telephonyManagerClass; 
     Object ITelephonyStub; 
     Class ITelephonyClass; 
     TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); 

     telephonyManagerClass = Class.forName(telephonyManager.getClass().getName()); 
    Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony"); 
    getITelephonyMethod.setAccessible(true); 
    ITelephonyStub = getITelephonyMethod.invoke(telephonyManager); 
    ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName()); 

    if (ON) { 
     dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity"); 

    } else { 
     dataConnSwitchmethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity"); 
    } 
    dataConnSwitchmethod.setAccessible(true); 
    dataConnSwitchmethod.invoke(ITelephonyStub); 
    }catch(Exception e){ 
      Log.e("Error:",e.toString()); 
    } 

} 
else 
{ 
    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); 
} 

}

+0

Niż tony ... działa dobrze – isumit

+1

+1 dla danych internetowych, choć nie udało mi się włączyć WIFI w ten sposób, ponieważ setWifiEnabled to metoda WifiManager ten pracował dla mnie WifiManager wifiManager = (WifiManager) to .getApplicationContext(). getSystemService (Context.WIFI_SERVICE); wifiManager.setWifiEnabled (true); –

3

Można zapewnić możliwość użytkownikowi na ekranie za pomocą poniższego bloku kodu ....

public static ShowAvailable() 
{ 
    ConnectivityManager connectivityMgr = (ConnectivityManager) 
    getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo[] nwInfos = connectivityMgr.getAllNetworkInfo(); 
     for (NetworkInfo nwInfo : nwInfos) 
      { 
      Log.d(TAG, "Network Type Name: " + 
      nwInfo.getTypeName()); Log.d(TAG, "Network available: " + 
      nwInfo.isAvailable()); Log.d(TAG, "Network c_or-c: " + 
      nwInfo.isConnectedOrConnecting()); Log.d(TAG, "Network connected: " 
      + nwInfo.isConnected()); 
      } 

} 
1

Kontynuując odpowiedź @rIHaN JiTHiN, należy zauważyć, że dwa uprawnienia android.permission.UPDATE_DEVICE_STATS i android.permission.MODIFY_PHONE_STATE są przyznawane tylko aplikacji systemowej (ponieważ jest ona początkowo ustawiona w środowisku Eclipse lub Android Studio). Więc jeśli ktoś będzie musiał stawić czoła temu problemowi, spójrz na this solution.

Powiązane problemy