Android检测无数据连接的可能性

时间:2012-04-19 10:10:24

标签: android connectivity

我有一个应用程序需要通过GPRS或EDGE以某种随机间隔与服务器通信。但是当用户正在通话或停用时,应用程序无法访问互联网的可能性很小。时间我有两个场景的可恢复和不可恢复。

可恢复的方案

  • 通话时(用户将挂机,数据连接将处于活动状态 再次)
  • 无信号(有时信号可能会下降而手机会亮起来 再次发出信号)

不可恢复的情景

  • 飞行模式
  • 停用数据连接

当其可恢复时,我可以在一些定义的间隔后再次尝试连接。在不可恢复期间,我必须提醒用户。例如,如果用户停用数据连接或启用航班模式,我必须提醒用户。

编辑:我可以通过其中一个意图检测飞行模式。我无法找到其他人。

2 个答案:

答案 0 :(得分:1)

如果有效连接可用,则返回以下代码

public boolean isConnectionsAvailable() {
         boolean lRet = false;
         try{
             ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
             NetworkInfo info= conMgr.getActiveNetworkInfo();  
             if(info != null && info.isConnected()) {  
                 lRet = true ;
             }else{  
                 lRet = false ;
                }
         }catch (Exception e) {
             Log.d("Connection Error", e.toString());
             lRet = false ;
        }
         return lRet;
       }

在此之后,如果信号强度较低,则可以通过设置相关超时来发出 HTTP请求。如果发生超时,则向用户发送相关警报消息,如下所示

public void serverCall(String pURL){

   if (isConnectionsAvailable()){
     // Call server by setting proper timeout

   }

}

修改

检查飞行模式状态:

private static boolean isAirplaneModeOn(Context context) {

   return Settings.System.getInt(context.getContentResolver(),
           Settings.System.AIRPLANE_MODE_ON, 0) != 0;

}

答案 1 :(得分:0)

您可以尝试使用try和catch来围绕您的方法。如果该方法因为无论出于何种原因无法连接到您的服务器而失败,您可以从处理程序调用postDelayed并在预定的时间内重新运行您的方法。

Handler mHandler = new Handler();
Runnable yourMethodRunnable = new Runnable(){
    @Override
    public void run(){
        yourMethod();
    }
};

private void yourMethod(){
    try{
        // talk to server
    } catch (InCallException e) {
        mHandler.postDelayed(yourMethodRunnable, delay)
    } catch (NoSignalException e) {
        // etc...
    } catch (OtherException e) {
        // etc...
    }
}

例外只是示例,并且可能不存在,从Android Developer Docs获取您想要捕获的异常,或者在每次连接到时重新执行时查看LogCat的输出服务器会失败。