Android 后台IntentService强制关闭,因为设备已连接到WiFi,但未通过身份验证
我目前正在使用Android应用程序中的后台IntentService连接到我的服务器,以获取一些数据,并仅在连接可用时更新应用程序。如果设备连接到移动网络数据或经过验证的wifi连接或开放式wifi连接,则其工作正常 当设备无法访问移动数据网络,并且连接到需要验证的Wifi源,且连接尚未验证时,就会出现问题,服务团队将关闭,因为它无法通过未经验证的连接传输任何数据 我对连接到服务器并执行后台任务的入口点的检查如下所示Android 后台IntentService强制关闭,因为设备已连接到WiFi,但未通过身份验证,android,android-wifi,wifimanager,Android,Android Wifi,Wifimanager,我目前正在使用Android应用程序中的后台IntentService连接到我的服务器,以获取一些数据,并仅在连接可用时更新应用程序。如果设备连接到移动网络数据或经过验证的wifi连接或开放式wifi连接,则其工作正常 当设备无法访问移动数据网络,并且连接到需要验证的Wifi源,且连接尚未验证时,就会出现问题,服务团队将关闭,因为它无法通过未经验证的连接传输任何数据 我对连接到服务器并执行后台任务的入口点的检查如下所示 ConnectivityManager conMgr = (Connecti
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将不允许您传输任何数据,直到您通过导航进行伪登录转到浏览器页面并接受其使用条款和协议您可以在活动中移动连接检查(或在您有上下文的任何地方),然后从那里启动服务 因此,您不会受到intentService的强制关闭约束,它应该可以正常工作 编辑: 好的,明白了!以下是确保用户能够访问Internet的方法:
private boolean hasInternetAccess() {
boolean hasInternetAccess = false;
try {
//I set google but you can try anything "reliable"...
//isReachable(1) the timeout in seconds
hasInternetAccess = InetAddress.getByName("www.google.com").isReachable(1);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return hasInternetAccess;
}
因此,您的支票变成:
If(WifiConnected() && hasInternetAccess()){
//Do background Work...
}
这是通过某种ping来确保用户拥有互联网。
不要忘记,此方法需要在单独的线程中执行,否则将引发NetworkOnMainthreadException。在这里,您是安全的,因为您所在的IntentService有自己的线程。但我想知道那些可能看到这条线索的人。顺便说一句,我建议您更改此线程的标题,因为实际问题实际上和服务无关,而是和访问internet有关
以下是参考资料:
我希望这会有所帮助。方法
conMgr.getActiveNetworkInfo()
调用ConnectivityService,此调用的结果可以是null
。在语句(conMgr.getActiveNetworkInfo()!=null&&conMgr.getActiveNetworkInfo().isAvailable()&&conMgr.getActiveNetworkInfo().isConnected())中
调用三次。我怀疑这里可能有NPE,因为如果当时网络从3g变为WiFi,其中一个呼叫可能返回null
。如果您首先获取NetworkInfo实例,然后他们在其上调用isAvailable()
和isConnected()
(类似于您在WifiConnected()
中所做的操作)?或者您可以编写一个连接更改接收器。这对你来说是最好的
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
例外情况是什么?用例有点不同,因此IntentService由AlarmManager定期执行。因此,这里只需澄清一点,因为我似乎有点不对劲……问题是,即使您没有访问internet的权限,函数WifiConnected()也会返回true(例如,你没有接受星巴克的条款)?是吗?正确。这导致了问题。设备认为它已连接,并且可以在实际无法连接时与我的服务器进行数据通信,而我的应用程序执行后台http请求代码从服务器获取数据。好的,我会尝试一下,但我的重点是连接到WEP或WPA2 Wifi,甚至像我的星巴克示例isC一样打开onnected返回true,即使它实际上不是,因为身份验证仍然未完成。