web-dev-qa-db-ja.com

Wi-FiがAndroidに接続されているかどうかはどうすればわかりますか?

Wi-Fiが接続されていない限り、自分のユーザーが何かをダウンロードしようとさえしたくない。しかし、私はWi-Fiが有効になっているかどうかを見分けることしかできないように思えますが、それでも3G接続は可能です。

Android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
Android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
    return false;
}

しかし、状態は私が期待するものではありません。 Wi-Fiが接続されていても、状態としてOBTAINING_IPADDRを取得しています。

228
schwiz

ConnectivityManagerを使用してWi-Fiアダプターの状態を取得できるはずです。そこからあなたはできます それが接続されているか、さらには利用可能かどうかをチェックします

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (mWifi.isConnected()) {
    // Do whatever
}

注:あなたが追加する必要があることに注意してください。

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />

あなたに

これが動作するためのAndroidManifest.xml

注2public NetworkInfo getNetworkInfo (int networkType) は廃止予定です。

このメソッドはAPIレベル23で廃止されました。このメソッドは同じタイプの複数の接続ネットワークをサポートしません。代わりにgetAllNetworks()とgetNetworkInfo(Android.net.Network)を使用してください。

注3public static final int TYPE_WIFI は廃止予定です。

この定数はAPIレベル28で廃止されました。アプリケーションは代わりにNetworkCapabilities.hasTransport(int)またはrequestNetwork(NetworkRequest、NetworkCallback)を使用して適切なネットワークを要求します。サポートされているトランスポート用。

454
Jason Knight

メソッドNetworkInfo.isConnected()廃止予定 in API-2になったため、Wi-Fiアダプタが有効かどうかを検出するメソッドを次に示します。代わりにWifiManagerを使ってアクセスポイントに接続します。

private boolean checkWifiOnAndConnected() {
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        if( wifiInfo.getNetworkId() == -1 ){
            return false; // Not connected to an access point
        }
        return true; // Connected to an access point
    }
    else {
        return false; // Wi-Fi adapter is OFF
    }
}
62
revolutionary

私は単に以下を使います。

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();

GetSupplicantState()を呼び出すと、これらの状態の1つが返されます。

関連付け - 関連付けが完了しました。

ASSOCIATING - アクセスポイントに関連付けようとしています。

COMPLETED - すべての認証が完了しました。

DISCONNECTED - この状態は、クライアントがアソシエートされていないことを示しますが、アクセスポイントの検索を開始する可能性があります。

DORMANT - クライアントが明示的なDISCONNECTコマンドを発行したときに報告されるAndroidが追加された状態。

FOUR_WAY_HANDSHAKE - WPA 4方向キーハンドシェイクが進行中です。

GROUP_HANDSHAKE - WPAグループキーハンドシェイクが進行中です。

INACTIVE - 非アクティブ状態。

INVALID - 通常は見られることのない疑似状態。

スキャン - ネットワークをスキャンしています。

UNINITIALIZED - 接続なし.

34
Donal Rafferty

アクティブなネットワークがWi-Fiであるかどうかを確認するために私は自分のアプリでこれを使用しています。

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{

    // Do your work here

}
18
kuchi

私はこのようないくつかの質問を見て、これを思い付きました:

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isConnected()){
    // If Wi-Fi connected
}

if (mobile.isConnected()) {
    // If Internet connected
}

Root Toolbox PROで自分のライセンスをチェックするために使っていますが、うまく動作するようです。

17
LukeMovement

Jason's answer は正しいのですが、最近getNetWorkInfo(int)は推奨されないメソッドです。そのため、次の関数はいい選択肢になるでしょう。

public static boolean isWifiAvailable (Context context)
{
    boolean br = false;
    ConnectivityManager cm = null;
    NetworkInfo ni = null;

    cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ni = cm.getActiveNetworkInfo();
    br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));

    return br;
}
6
Val Martinez

WifiManagerを使うと、次のことができます。

WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}

メソッド getNeworkId は、ネットワークに接続されていない場合にのみ-1を返します。

3
razzak
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
                  ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
                    ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
    Toast.makeText(
        getApplicationContext(),
        "Please make sure, your network connection is ON ",
        Toast.LENGTH_LONG).show();
}
else {
    // Put your function() to go further;
}
3
G M Ramesh

この方法を試してください。

public boolean isInternetConnected() {
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean ret = true;
    if (conMgr != null) {
        NetworkInfo i = conMgr.getActiveNetworkInfo();

        if (i != null) {
            if (!i.isConnected()) {
                ret = false;
            }

            if (!i.isAvailable()) {
                ret = false;
            }
        }

        if (i == null)
            ret = false;
    } else
        ret = false;
    return ret;
}

この方法は、インターネット接続が利用可能かどうかを確認するのに役立ちます。

2
M D

これは私のために働く:

    ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    // Mobile
    State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

    // Wi-Fi
    State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

    // And then use it like this:

    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
    }
    else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled  :) ....",Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
    }

そしてこのパーミッションを追加してください:

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

これが私のアプリでユーティリティメソッドとして使用しているものです。

public static boolean isDeviceOnWifi(final Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi != null && mWifi.isConnectedOrConnecting();
}
1
Mahendra Liya

@Jason Knightの回答と似ていますが、Kotlinの方法では、

val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

if (mWifi.isConnected) {
     // Do whatever
}
1
Jerry Chong

新しいバージョンのAndroid

private void getWifiInfo(Context context) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = connManager.getAllNetworks();

    if(networks == null || networks.length == 0)
        return;

    for( int i = 0; i < networks.length; i++) {
        Network ntk = networks[i];
        NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
        if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            if (connectionInfo != null) {
                // add some code here
            }
        }

    }
}

許可を追加します

1
Albert Nguyen

これはより簡単な解決策です。スタックオーバーフローの質問AndroidでWi-Fiが有効かどうかの確認を参照してください。

P.Sパーミッションを許可するためにmanifest.xmlファイルにコードを追加することを忘れないでください。以下の通り.

<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
0
user2715530

やってみる

wifiManager.getConnectionInfo().getIpAddress()

これは、デバイスが使用可能な接続になるまで0を返します(私のマシンではSamsung SM-T280、Android 5.1.1)。

0
Adrian

次のようにアクティブにされていない場合は、WIFIをオンにすることができます。@ Jason Knightが回答したようにWIFIの状態を確認します。

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />

あなたのJavaクラスはそのようにすべきです

public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //check WIFI activation
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected() == false) {
        showWIFIDisabledAlertToUser();
    }
    else {
        Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
    }
}


private void showWIFIDisabledAlertToUser(){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
            .setCancelable(false)
            .setPositiveButton("Goto Settings Page To Enable WIFI",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int id){
                            Intent callGPSSettingIntent = new Intent(
                                    Settings.ACTION_WIFI_SETTINGS);
                            startActivity(callGPSSettingIntent);
                        }
                    });
    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int id){
                    dialog.cancel();
                }
            });
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

}

0
Ahmed Belal

回答の多くは、廃止されたコード、またはより高度なAPIバージョンで利用可能なコードを使用しています。今、私はこのようなものを使用します

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(connectivityManager != null) {
            for (Network net : connectivityManager.getAllNetworks()) {
                NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
                if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
                    return true;
            }
        }
        return false;
0
Oleg Shevchenko