Как предоставить возможность выбора Wi-Fi или GPRS для подключения к сети в приложении для Android

В своем приложении я хочу предоставить пользователю возможность выбрать Wi-Fi/GPRS для сетевого подключения к веб-серверу. Могут быть ответы на следующие вопросы, чтобы решить мою проблему ... 1. Как проверить, какой параметр подключения к сети по умолчанию включен. 2. Как включить wi-fi/GPRS по выбору пользователя или (отключить wi-fi, если пользователь выбирает GPRS - если только эта опция будет необходима для работы GPRS)

или есть какой-то другой способ сделать это?


person isumit    schedule 26.07.2012    source источник


Ответы (3)


Попробуй это:

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
}

Не забудьте добавить эти разрешения в файл манифеста;

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

Чтобы включить или отключить Wi-Fi, используйте mWiFi.setWifiEnabled(true|false)

Чтобы включить/отключить GPRS/3G, используйте следующий фрагмент кода.

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

}

person JiTHiN    schedule 26.07.2012
comment
+1 за интернет-данные, хотя мне не удалось активировать Wi-Fi таким образом, потому что setWifiEnabled — это метод WifiManager. Это сработало для меня WifiManager wifiManager = (WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled (истина); - person magmike; 13.05.2014

Вы можете предоставить пользователю возможность на экране, используя следующий блок кода....

 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()); 
          }

}
person Jigar Pandya    schedule 26.07.2012

Продолжая ответ @rIHaN JiTHiN, следует отметить, что два разрешения android.permission.UPDATE_DEVICE_STATS и android.permission.MODIFY_PHONE_STATE предоставляются только системному приложению (как оно изначально установлено в Eclipse или Android Studio). Поэтому, если кто-то столкнется с этой проблемой, посмотрите на это решение .

person Sergey V.    schedule 30.04.2014