0

現在、Android アプリでバックグラウンド IntentService を使用してサーバーに接続し、データを取得して、接続が利用可能な場合にのみアプリを更新しています。デバイスがモバイル ネットワーク データまたは認証された Wi-Fi 接続またはオープン Wi-Fi 接続に接続されている場合、完全に機能します。

この問題は、デバイスがモバイル データ ネットワークにアクセスできず、認証が必要な 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"));
        }

基本的に、バックグラウンド タスクを実行する前に確認しているのは、デバイスにアクティブなネットワーク接続があり、接続されているかどうか、または接続が Wi-Fi であるかどうか、その接続が認証完了でデータ転送が可能であるかどうかです。

これは機能していないようで、失敗してもサービスが強制的に閉じられます。

wifi認証が関係しているときにネットワーク接続を確認してからバックグラウンド処理を行う正しい方法は何ですか?

ありがとう。

この問題の良い例は、全国のスターバックスにいるときに、Android デバイスが自動的に attwifi に接続し、wifi ステータスが接続済みに変わることです。ブラウザページに移動して使用条件と同意書に同意することにより疑似サインインするまでデータ

4

3 に答える 3

0

接続チェックをアクティビティ (またはコンテキストがある他の場所) に移動し、そこからサービスを開始できます。

したがって、intentService の強制終了制約はなく、正常に動作するはずです。

編集:

はい、わかった!ユーザーがインターネットにアクセスできることを確認するためにできることは次のとおりです。

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 にいるので安全です。しかし、私はこのスレッドを見るかもしれない人のために正確に. ところで、実際の問題は実際にはサービスではなくインターネットへのアクセスに関連しているため、このスレッドのタイトルを変更することをお勧めします.

参照は次のとおりです。インターネット接続のテストAndroid

これが役立つことを願っています。

于 2013-08-29T19:33:56.833 に答える
0

または、接続変更のレシーバーを作成できます。あなたの場合はそれが一番でしょう。

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
于 2015-04-14T11:03:53.660 に答える
0

ConnectivityService へのメソッドconMgr.getActiveNetworkInfo()呼び出しと、この呼び出しの結果は になる可能性がありますnull。ステートメントでは、(conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr.getActiveNetworkInfo().isConnected())3 回呼び出します。nullその時点でネットワークが 3g から WiFi に変更された場合、これらの呼び出しのいずれかが返される可能性があるため、ここに NPE が存在する可能性があると思われます。最初に NetworkInfo インスタンスを取得し、それに対して and を呼び出したらどうなるでしょうisAvailable()isConnected()( で行った方法と同様WifiConnected()です)。

于 2013-08-29T20:41:51.500 に答える