Habilitar conexão 3G/Wifi programaticamente

1 Flares Twitter 0 Facebook 1 Google+ 0 LinkedIn 0 Filament.io 1 Flares ×

Se você já fez um app que precisa conectar na internet já se perguntou: “Será que consigo habilitar o 3G ou Wifi programaticamente?”. Resposta: consegue sim e não é difícil!!

Claro que é interessante perguntar ao usuário se ele quer realmente habilitar estas funcionalidades. Não adianta habilitar a wifi em um local onde não existe rede para se conectar bem como não é legal habilitar o 3G se o usuário não possui um plano de dados ativo. Sendo assim aconselho a colocar alguma interface onde o usuário possa escolher sobre qual a rede quer habilitar e uma vez que ele escolha a sua aplicação executa um dos métodos abaixo:

  • 3G:
private Boolean setMobileDataEnabled(Context context, boolean enabled) {
    final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Class<?> conmanClass;
	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);

    if (setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled) != null){
    	return true;
    } else {
    	return false;
    }
}
  • Wifi:
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
if(!wifiManager.isWifiEnabled()){  
	if (wifiManager.setWifiEnabled(true)){
    		if (wifiManager.isWifiEnabled()){
    	    		Toast.makeText(ctx, "Conexão Wifi habilitada." , 5).show();
    	    	} else{
    	    		Toast.makeText(ctx, "Ops, parece que não consegui habilitar sua Wifi." , 5).show();
    	    	}
    	} else {
    		Toast.makeText(ctx, "Ops, parece que não consegui habilitar sua Wifi.." , 5).show();
    	}
}else{  
	Toast.makeText(ctx, "Estranho, parece que sua Wifi já estava habilitada." , 10).show();  
    	Toast.makeText(ctx, "Talvez você não esteja conectado em alguma rede." , 10).show();
}

Antes de executar ainda é necessário adicionar algumas permissões no seu AndroidManifest.xml conforme abaixo:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>

Faça alguns testes e verifique a melhor maneira de controlar se a conexão foi ativada. Eu costumo colocar um “Thread.sleep(tempo);” logo após a execução de cada código e verifico novamente se existe alguma conexão ativa. Aconselho colocar este tempo entre ativar e fazer a nova verificação pois pode levar alguns segundos até que a conexão seja realmente estabelecida.

update: Depois de alguns testes foi verificado que o código para habilitar o 3G só funciona nas versões 2.3.x  ou superiores. Assim que eu descobrir como habilitar em versões anteriores faço uma nova atualização.