246

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、状態として取得しています。

4

24 に答える 24

477

ConnectivityManagerを使用してWi-Fiアダプターの状態を取得できるはずです。そこから、接続されているか、使用可能かどうかを確認できます

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

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

注:追加する必要があることに注意してください(ここではn00biesの場合)。

<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)を使用して適切なネットワークを要求する必要があります。サポートされているトランスポートの場合。

于 2010-10-01T17:00:34.690 に答える
88

メソッドNetworkInfo.isConnected()API-23で非推奨になったため、代わりに WifiManager を使用して Wi-Fi アダプターがオンになっていて、アクセス ポイントに接続されているかどうかを検出するメソッドを次に示します。

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
    }
}
于 2016-01-20T15:42:37.477 に答える
36

私は単に以下を使用します:

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

getSupplicantState(); を呼び出すと、これらの状態のいずれかが返されます。

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

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

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

DISCONNECTED - この状態は、クライアントが関連付けられていないが、アクセス ポイントの検索を開始する可能性が高いことを示します。

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

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

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

INACTIVE - 非アクティブ状態。

INVALID - 通常は見られない疑似状態。

SCANNING - ネットワークのスキャン。

UNINITIALIZED - 接続なし。

于 2010-10-01T17:04:46.310 に答える
21

アプリでこれを使用して、アクティブなネットワークが 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

}
于 2012-01-27T04:04:40.107 に答える
18

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

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 でのライセンス チェックに if を使用していますが、うまく機能しているようです。

于 2011-07-09T09:28:17.783 に答える
7

Jason の答えは正しいですが、現在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;
}
于 2016-01-12T10:29:41.213 に答える
4

次のコード (Kotlin 内) は、API 21 から少なくとも最新の API バージョン (API 29) まで機能します。関数 getWifiState() は、WiFi ネットワーク状態の 3 つの値のうちの 1 つを返します: Disable、EnabledNotConnected、および Connected は列挙型クラスで定義されています。これにより、WiFi を有効にするようユーザーに通知したり、既に有効になっている場合は利用可能なネットワークの 1 つに接続したりするなど、より詳細な決定を下すことができます。しかし、WiFi インターフェースがネットワークに接続されているかどうかを示すブール値だけが必要な場合は、他の関数 isWifiConnected() がそれを提供します。以前のものを使用し、結果を Connected と比較します。

以前の回答のいくつかに触発されましたが、Android API の進化または徐々に増加している IP V6 の可用性によってもたらされた問題を解決しようとしています。トリックは使用することでした:

wifiManager.connectionInfo.bssid != null 

それ以外の:

  1. getIpAddress() == 0 IP V4 または
  2. getNetworkId() == -1 別の特別な許可 (場所) が必要になりました

ドキュメントによると: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid ネットワークに接続されていない場合は null が返されます。実際の値を取得する権限がなくても、接続されていれば null 以外の値が返されます。

また、次の点にも注意してください。

android.os.Build.VERSION_CODES#N より前のリリースでは、呼び出しプロセス内でのメモリ リークを避けるために、このオブジェクトは Context#getApplicationContext() からのみ取得し、他の派生コンテキストからは取得しないでください。

マニフェストでは、次のことを忘れずに追加してください。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

提案されたコードは次のとおりです。

class MyViewModel(application: Application) : AndroidViewModel(application) {

   // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext

   // Define the different possible states for the WiFi Connection
    internal enum class WifiState {
        Disabled,               // WiFi is not enabled
        EnabledNotConnected,    // WiFi is enabled but we are not connected to any WiFi network
        Connected,              // Connected to a WiFi network
    }

    // Get the current state of the WiFi network
    private fun getWifiState() : WifiState {

        val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        return if (wifiManager.isWifiEnabled) {
                    if (wifiManager.connectionInfo.bssid != null)
                        WifiState.Connected
                    else
                        WifiState.EnabledNotConnected
               } else {
                    WifiState.Disabled
               }
    }

    // Returns true if we are connected to a WiFi network
    private fun isWiFiConnected() : Boolean {
        return (getWifiState() == WifiState.Connected)
    }
}
于 2019-09-21T07:42:40.820 に答える
3

WifiManagerあなたができることを使用して:

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

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

于 2015-02-08T19:04:04.840 に答える
3
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;
}
于 2012-08-17T06:10:58.427 に答える
2

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

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;
}

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

于 2013-12-06T10:58:08.207 に答える
0

次のようにアクティブ化されていない場合は、WIFI をオンにすることができます。 1. @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();
}

}

于 2017-01-01T12:19:31.587 に答える
0

これはより簡単な解決策です。Stack Overflow の質問Checking Wi-Fi enabled or not on Androidを参照してください。

PS パーミッションを許可するために 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>
于 2015-11-30T13:06:14.657 に答える