21

電話が開いている Wi-Fi ネットワークを見つけて接続するとします。ただし、Wi-Fi ネットワークは「非アクティブ」です。つまり、ブラウザを開くと、資格情報を求めるプロンプトが表示されます。携帯電話 (Web ブラウザーなど) には多くのアプリがありますが、そのような場合は機能しません。モバイル ネットワークを使用してデータを送信したいのですが、システムはまだWi-Fi を使用しようとします。

NetworkInfo.isAvailable()それでも、説明されているwi-fiネットワークにNetworkInfo.isConnected()戻ります。解決策はありますか?true

4

6 に答える 6

2

私は同じ問題を抱えていますが、Android SDKを介してそのような可能性はないことがわかりました。それを行うには、独自の方法を作成する必要があります。

ネットワークで何をしたいのか、「非アクティブ」とはどういう意味かによって異なります。インターネットに接続されていないルーターに接続でき、そのような状況を確認するAndroidの方法はありません。MrMichaelが書いたように、pingはそれをチェックする1つの方法ですが、その場合、肯定的なテストはpingに関する情報を提供します-ネットワークにはpingを送信できる重いファイアウォールがありますが、HTTPリクエストは通過しません。

その場合、あなたはあなた自身のニーズのためにあなた自身のカスタムテストを書かなければなりません、悲しいかな-それは私がしたことです。単純なpingのようなプロトコルを実装しました(ソケットを適切なIP /ポートに接続し、短い応答を待つ短いメッセージを送信しようとします)。それだけで、必要な接続を確立できるという100%の保証が得られます。

于 2012-08-20T10:39:48.900 に答える
2

私が知る限り、Wi-Fi 経由でデータ接続を強制的に使用する方法はありません (おそらく、とにかくユーザーの操作なしで行うべきではないことです)。

多くのアプリケーションで同じ要件があります。スプラッシュ スクリーンの読み込み中に実行可能なネットワーク接続があるかどうかを知りたいです (たとえば、そうでない場合はアプリの読み取り専用バージョンを表示します)。

これを回避する方法は、サーバーへの単純なサービス呼び出しを起動isAliveすることです。これは、ただちに true を返します。これは、自分のサービスを表示できることを示すだけでなく、サーバーがオンラインであることも確認します (私の側では問題はありません)。タイムリーに応答が返ってこない場合は、ユーザーにネットワーク接続がないことを伝え、「続行する前に有効なデータ/wifi 接続があることを確認してください」と伝えます。次にisConnected、wifi のプロパティを取得し、このメッセージを「現在のワイヤレス接続ではインターネットにアクセスできません」などのメッセージに変更します。

あなたが望んでいた答えではありませんが、可能性はありますか?

于 2012-08-20T12:14:39.987 に答える
2

提案: requestRouteToHost()を使用してみてください。ただし、最初に SO を検索して、この方法を使用する際の問題を探します。

CHANGE_NETWORK_STATEまた、許可が必要になります。

于 2012-08-23T14:25:03.640 に答える
1

これを試して....

私はいくつかのカスタム作業を行う必要がありました..しかし、それを起動して実行しました...

オフswitches from Wifi to Mobile networkのときの私のコード。

そして、wifi接続がまだオンになっている間TimeService at port 37にインターネットが死んでいることを知るためにを使用しています

/////////////////////////編集済み////////////////////// ///////////

今、私はここにcomplete working code私が作ったものを入れています。DRYここで(繰り返さない原則)が乱用されているので、ご容赦ください。そのため、コードをリファクタリングし、重複したコードを method に変換してください。つまり、本番ネットワークで使用する場合はsingle sensible place

/////---------------------------Intial Available Network Checking



private boolean checkConnection(){


boolean connected = false;
ConnectivityManager cm =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if (cm != null) {
NetworkInfo[] netInfo = cm.getAllNetworkInfo();

for (NetworkInfo ni : netInfo) {
if ((ni.getTypeName().equalsIgnoreCase("WIFI")
|| ni.getTypeName().equalsIgnoreCase("MOBILE"))
& ni.isConnected() & ni.isAvailable()) {
connected = true;
     }

   }
 }


return connected;

} ///// --------------------------- 最初に利用可能なネットワークのチェック

/////-------------------------------Check for the working Internet Connection


public boolean inetAddr(){

    boolean x1 = false;


    try {
        Socket s = new Socket("utcnist.colorado.edu", 37);

        InputStream i = s.getInputStream();

        Scanner scan = new Scanner(i);

        while(scan.hasNextLine()){

            System.out.println(scan.nextLine());
            x1 = true;
        }
    } catch (Exception e) {


            x1 = false;
    } 

    return x1;

}

/////-------------------------------Check for the working Internet Connection


////-------------------------------Check Mobile Conectivity Again

public boolean mobileConnect(){

    boolean conn = false;
    ConnectivityManager cm =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if(activeNet != null){

        conn = true;
    }else{

        conn = false;
    }

    return conn;



}

////------------------------------Check Mobile Conectivity Again

ここで私は上記の方法を使用しています....

try{    
     if (!checkConnection()){


         AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
         myAlertDialog.setTitle("--- Connectivity Check ---");
         myAlertDialog.setMessage("No Internet Connectivity");
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

          public void onClick(DialogInterface arg0, int arg1) {

            YumZingSplashActivity.this.finish();
            //splashHandler.removeCallbacks(launcherRunnable);

          }});
            System.out.println("No Internet Connectivity");

            myAlertDialog.show();           




        }
        else{


              if(inetAddr()){
            aphandle = APIHandling.getInstance();
            aphandle.xmlCreateSession();
            System.out.println("Net Connectivity is Present");
            DURATION = Integer.valueOf(getString(R.string.splash_duration));



            splashHandler = new Handler();

            //  ================ Main Code of the Application
            launcherRunnable = new Runnable() {

                public void run() {
                    Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    YumZingSplashActivity.this.finish();
                }
            };
            if (DEBUG)
            {
                splashHandler.post(launcherRunnable);
            }
            else{


                splashHandler.postDelayed(launcherRunnable, DURATION);
            }

        }
              else{

                  if(mobileConnect()){


                      if(inetAddr()){
                      aphandle = APIHandling.getInstance();
                        aphandle.xmlCreateSession();
                        System.out.println("Net Connectivity is Present");
                        DURATION = Integer.valueOf(getString(R.string.splash_duration));



                        splashHandler = new Handler();

                        //  ================ Main Code of the Application
                        launcherRunnable = new Runnable() {

                            public void run() {
                                Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class);
                                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                startActivity(i);
                                YumZingSplashActivity.this.finish();
                            }
                        };
                        if (DEBUG)
                        {
                            splashHandler.post(launcherRunnable);
                        }
                        else{


                            splashHandler.postDelayed(launcherRunnable, DURATION);
                        }
                      }else{

                          AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
                         myAlertDialog.setTitle("--- Connectivity Check ---");
                         myAlertDialog.setMessage("No Internet Connectivity");
                         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                          public void onClick(DialogInterface arg0, int arg1) {

                            YumZingSplashActivity.this.finish();
                            //splashHandler.removeCallbacks(launcherRunnable);

                          }});
                            System.out.println("No Internet Connectivity");

                            myAlertDialog.show();       
                      }
                  }else{




                         AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
                         myAlertDialog.setTitle("--- Connectivity Check ---");
                         myAlertDialog.setMessage("No Internet Connectivity");
                         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                          public void onClick(DialogInterface arg0, int arg1) {

                            YumZingSplashActivity.this.finish();
                            //splashHandler.removeCallbacks(launcherRunnable);

                          }});
                            System.out.println("No Internet Connectivity");

                            myAlertDialog.show();           






                  }

              }
        }

     //setContentView(R.layout.yumzing_splash_layout);
    }  catch(Exception ex){

            System.out.println("Leak ko catch");
        }



    }
于 2012-08-20T10:19:49.347 に答える
1

Wi-Fi ネットワークに接続し、バックグラウンドで任意のページに接続して、リダイレクトがあるかどうかを確認できます。その場合、資格情報ページである可能性が非常に高くなります。実際、先ほど説明したソリューションを実装する方法を見つけようとしていたときに 、Android 開発者サイトのHttpURLConnectionクラス ドキュメントに記述されていることがわかりました。そこで読むことができます:

ネットワーク サインオンの処理

一部の Wi-Fi ネットワークは、ユーザーがサインオン ページをクリックするまで、インターネット アクセスをブロックします。このようなサインオン ページは、通常、HTTP リダイレクトを使用して表示されます。getURL()接続が予期せずリダイレクトされたかどうかをテストするために使用できます。getHeaderFields()このチェックは、またはを呼び出してトリガーできる応答ヘッダーが受信されるまで有効ではありませんgetInputStream()。たとえば、応答が予期しないホストにリダイレクトされなかったことを確認するには、次のようにします。

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
   try {
     InputStream in = new BufferedInputStream(urlConnection.getInputStream());
     if (!url.getHost().equals(urlConnection.getURL().getHost())) {
       // we were redirected! Kick the user out to the browser to sign on?

     ...
   } finally {
     urlConnection.disconnect();
   }
 }
于 2012-08-27T05:55:22.590 に答える
0

試す

InetAddress.getByName(host).isReachable(timeOut)
于 2012-08-27T07:21:25.540 に答える