Android authentication gets in deadlock when using EAP with PEAP
I've spent several days trying to figur开发者_开发知识库e out what is wrong with my android phone's wifi at school. The school wifi is 802.1x EAP using PEAP..requires username, password.
I've had two Android phones, and have run many different ROMs on them so I know this isn't just a ROM specific problem. I'm currently running 2.2.1 on a Mytouch 3g fender ed. I don't have a data plan with my phone so I keep data off. I only use wifi.
The problem I have is that after I connect to the wifi, everything is fine for a while, but soon (perhaps 15 minutes to an hour later), I'll turn my phone on and when I see the wifi connection, it says Authenticating and it stays stuck there till I reset it. If I try to surf the Internet with normal HTTP it works fine, but if I try to run any apps that require wifi connection, they give an error saying there is a network connection (example would be Google Voice search which will say "Connection Problem"). Feeds can't update, gmail won't update, etc. After I reset the connection, the wifi works perfectly again. I am not sure why this happens. I think it has something to do with how the school's wifi is set up.
To make a quick fix to the problem however, I'm writing an app that will test if the connection is authenticating and reassociate the connection if it is. I'm running into problems though.
Here is the code to see if the wifi is authenticating and also some debug output:
private void checkWifi() {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
SupplicantState state = info.getSupplicantState();
Log.d(getClass().getSimpleName(), state.toString());
NetworkInfo.DetailedState state2 = WifiInfo.getDetailedStateOf(info.getSupplicantState());
Log.d(getClass().getSimpleName(), state2.toString());
}
And here's the log output:
D/WifiCheckerService(24732): COMPLETED
D/WifiCheckerService(24732): OBTAINING_IPADDR
The log output is the same no matter if the wifi on the phone says Connected or Authenticating which means my program as of now cannot distinguish if it is in the funky "authentication" state or not. I need to be able to distinguish in order to be able to know when to reset the wifi. Any help is greatly appreciated.
Try this.
ConnectivityManager conn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nInfo = conn.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
Log.d("MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE", nInfo.getDetailedState().toString());
Log.d("MY CONNECTIVITY MANAGER: NETWORK.STATE", nInfo.getState().toString());
Here's my Output (If you entered a wrong password while connecting).
D/MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE(24732): AUTHENTICATING D/MY CONNECTIVITY MANAGER: NETWORK.STATE(24732): CONNECTING
Second Output (While obtaining IP).
D/MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE(24732): OBTAINING_IPADDR
D/MY CONNECTIVITY MANAGER: NETWORK.STATE(24732): CONNECTED
Third Output (Successfully Connected).
D/MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE(24732): CONNECTED
D/MY CONNECTIVITY MANAGER: NETWORK.STATE(24732): CONNECTED
4th Output (If you entered wrong password and failed to connect).
D/MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE(24732): DISCONNECTED
D/MY CONNECTIVITY MANAGER: NETWORK.STATE(24732): DISCONNECTED
5th Output (If WIFI is IDLE and DISCONNECTED).
D/MY CONNECTIVITY MANAGER: NETWORK.DETAILEDSTATE(24732): IDLE
D/MY CONNECTIVITY MANAGER: NETWORK.STATE(24732): DISCONNECTED
// hope it helps
精彩评论