web-dev-qa-db-ja.com

Android-プログラムでインターネット接続を確認し、notConnectedの場合はダイアログを表示する

私はライブプロジェクトに取り組んでいます。ユーザーがアプリをクリックしたとき。ようこそ画面が表示されます(その画面にはWebビューがあります)。インターネットが接続されていない場合、アプリはクラッシュします。基本的に、私の問題は、モバイルがインターネットに接続されているかどうかをプログラムで確認することです。そうでない場合は、WebサービスからWebViewにデータをフェッチせずに、「インターネット接続を確認してください」を示すダイアログボックスを表示します

研究をしながら、多くのことを発見し、それを実装しようとしました。しかし、それは私の要件を満たしていない

私のコードは、

_public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    else
    {
        Description.setVisibility(View.INVISIBLE);
        new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(
                getResources().getString(
                        R.string.internet_error))
        .setPositiveButton("OK", null).show();
    }
    return false;
}
_

AsyncTaskdoInBackground()でこの関数を呼び出しています

助けてください!

22
Java_Android

最後に、私は答えを得ました。

ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null){
    Description.setVisibility(View.INVISIBLE);
    new AlertDialog.Builder(WelcomePage.this)
        .setTitle(getResources().getString(R.string.app_name))
        .setMessage(getResources().getString(R.string.internet_error))
        .setPositiveButton("OK", null).show();
}else{
    dialog = ProgressDialog.show(WelcomePage.this, "", "Loading...", true,false);
    new Welcome_Page().execute();
}
13
Java_Android

このライブラリをチェックアウトできます:

https://github.com/novoda/merlin

あなたはただimplement Connectableそして、ネットワークがダウンまたはアップしたときにコールバックを取得します。

したがって、このシナリオでダイアログを表示できます。

ライブラリに現在の状態を照会し、ネットワークタスクを実行しないように選択することもできます

example

Merlinの作成(Merlin.Builder()を使用)

merlin = new Merlin.Builder().withConnectableCallbacks().build(context);

アクティビティでサービスをバインドおよびバインド解除します

@Override
protected void onResume() {
    super.onResume();
    merlin.bind();
}

@Override
protected void onPause() {
    super.onPause();
    merlin.unbind();
}

コールバックに登録する

merlin.registerConnectable(new Connectable() {
        @Override
        public void onConnect() {
            // Do something!
        }
});

デモ内の MerlinActivity は、メインアプリケーションコードからMerlinを整理する簡単な方法を示しています。

26
Blundell

インターネット接続を確認する

 ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo netInfo = mgr.getActiveNetworkInfo();

        if (netInfo != null) {
            if (netInfo.isConnected()) {
                // Internet Available
            }else {
               //No internet
            }
        } else {
            //No internet
        }

これは、インターネット接続を確認する簡単な機能です。 Connectedはtrueを返し、そうでない場合はfalseを返します。

 public boolean isInternetOn() {

        // get Connectivity Manager object to check connection
        ConnectivityManager connec =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        // Check for network connections
        if (connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.CONNECTED ||
                connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.CONNECTING ||
                connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.CONNECTED) {


            return true;

        } else if (
                connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.DISCONNECTED ||
                        connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.DISCONNECTED) {


            return false;
        }
        return false;
    }
}

インターネット接続を確認し、有効なまたはサーバーに含まれるURLを確認するプロジェクトを次に示します this

6
putulputul
if (InternetConnection.checkConnection(context)) {
    // Internet Available...
} else {
    // Internet Not Available...
}

クラスの下にコピーするだけ

public class InternetConnection {

    /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */
    public static boolean checkConnection(Context context) {
        final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();

        if (activeNetworkInfo != null) { // connected to the internet
            Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show();

            if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
                return true;
            } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to the mobile provider's data plan
                return true;
            }
        }
        return false;
    }
}

マニフェストに次の許可を与える

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
2
Makvin

上記のさまざまな方法を試しましたが、それ以外にもいくつかのケースで捕まったことがあります。最後に、以下のコードスニペットを使用してネットワーク呼び出しを行います...

try {
    InetAddress address = InetAddress.getByName("www.stackoverflow.com");
    //Connected to working internet connection
} catch (UnknownHostException e) {
    e.printStackTrace();
    //Internet not available
}

これは多くの観点で役立ちます。このアプローチでうまくいかない場合は、お知らせください。

2
Khan
 public boolean isOnline() {
        NetworkInfo activeNetworkInfo = ((ConnectivityManager) 
        getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        return activeNetworkInfo != null && 
        activeNetworkInfo.isConnectedOrConnecting();
    }
1
Bipin Patel

doInBackgroundはメインUIとは異なるスレッドで実行されるため、ここにダイアログを表示することはできません。代わりに、AsyncTaskonPreExecute をオーバーライドし、そこでテストを行います。

0
Phil