我目前在我的 Android 应用程序中使用后台 IntentService 连接到我的服务器以获取一些数据并仅在连接可用时更新应用程序。如果设备连接到移动网络数据或经过身份验证的 wifi 连接或打开的 wifi 连接,它可以完美运行。
当设备无法访问移动数据网络并连接到需要身份验证的 Wifi 源并且连接尚未经过身份验证时,会出现问题,服务强制关闭,因为它无法通过未经身份验证的连接传输任何数据。
我对入口点的检查以连接到服务器并执行后台任务是下面的检查。
ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if((conMgr.getActiveNetworkInfo() != null &&
conMgr.getActiveNetworkInfo().isAvailable() &&
conMgr.getActiveNetworkInfo().isConnected()) || WifiConnected() == true){
//做后台处理 }
WifiConnected() 方法如下所示。
private boolean WifiConnected() {
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
SupplicantState supState;
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
return (networkInfo != null && networkInfo.isConnected() && supState.toString().contentEquals("COMPLETED"));
}
所以基本上我在执行后台任务之前检查的是设备是否具有活动的网络连接并已连接,或者连接是否为 wifi,如果该连接已完成身份验证,以便可以进行数据传输。
这似乎不起作用,也失败了,使服务仍然强制关闭。
当涉及wifi身份验证然后进行后台处理时,检查网络连接的正确方法是什么?
谢谢。
这个问题的一个很好的例子是,当您在全国任何一家星巴克时,您的 android 设备将自动连接到 attwifi 并且 wifi 状态更改为已连接,因为我检查 isConnected 返回 true 但您会注意到星巴克的 attwifi 不会让您传输任何数据,直到您通过导航到浏览器页面并接受他们的使用条款和协议来伪登录