Android で Wi-Fi が接続されているかどうかを確認するにはどうすればよいですか?
-
27-09-2019 - |
質問
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
状態として。
解決
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 これが機能するように。
注2: public NetworkInfo getNetworkInfo (int networkType)
現在は非推奨になっています:
このメソッドは API レベル 23 で非推奨になりました。この方法は、同じタイプの複数の接続されたネットワークをサポートしていません。代わりに、getallnetworks()およびgetNetWorkInfo(android.net.network)を使用してください。
注3: public static final int TYPE_WIFI
現在は非推奨になっています:
この定数は API レベル 28 で非推奨になりました。アプリケーションは、代わりに NetworkCapabilities.hasTransport(int) または requestNetwork(NetworkRequest, NetworkCallback) を使用して、適切なネットワークを要求する必要があります。サポートされているトランスポートの場合。
他のヒント
その方法以来、 NetworkInfo.isConnected() 今でしょ 廃止された で API-23, ここでは、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
}
}
私は単純に以下のものを使用し
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
あなたはgetSupplicantState(呼び出し時にこれらのいずれかの状態を返します。);
ASSOCIATED - 協会が完了しました。
の関連付け - 関連付けるしようとすると、 アクセスポイントます。
COMPLETED - すべての認証 完了しました。
DISCONNECTED - この状態が示します そのクライアントが関連付けられている、されないが、 アクセスを探し始める可能性が高いです ポイント。
休止 - アンという状態をAndroidの付加 クライアントが発行したときに報告されます 明示的なDISCONNECTコマンド。
FOUR_WAY_HANDSHAKE - WPA 4ウェイキー 進行中のハンドシェイク。
GROUP_HANDSHAKE - WPAグループキー 進行中のハンドシェイク。
INACTIVE - 。非アクティブ状態
INVALID - 擬似状態べきこと 通常は見られないことが決してます。
スキャン - ネットワークをスキャンします。
UNINITIALIZED - 。接続なし。
私は、アクティブなネットワークがの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
}
私はこのようないくつかの質問を見ていたし、この思い付います:
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
}
ルートツールボックスPROの私のライセンスチェックのためならば、私は使用しており、それが仕事の偉大なように思えます。
ジェイソンの答えをしながら最近は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;
}
あなたが行うことができますWifiManager
を使用します:
WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}
方法 getNeworkId に戻ります-1、それがネットワークに接続されていない場合にのみ、;
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;
}
この方法を試してみてください。
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;
}
この方法は、インターネット接続が利用可能かどうかを見つけるのに役立ちます。
これは私のために動作します:
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" />
ここで私は自分のアプリケーションでユーティリティメソッドとして使用するものです。
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();
}
新しいバージョンでアンドロイド
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
}
}
}
}
と
に権限を追加@Jasonナイト答えに似ていますが、Kotlinの方法でます:
val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (mWifi.isConnected) {
// Do whatever
}
これは、より簡単なソリューションです。参照してくださいスタックオーバーフロー 質問ののWi-Fiは、Android に<上で有効かどうかチェックします/ em>の
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>
試してみてください
wifiManager.getConnectionInfo().getIpAddress()
デバイスまでこれを返す0は(私のマシンで、サムスンSM-T280、アンドロイド5.1.1)使用可能な接続を持っています。
あなたは上のWIFIをオンにすることができます 1.チェックWIFI状態@Jason騎士によって答えとして 2.起動しない場合は、それをアクティブ マニフェストファイル内の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();
}
}
答えの多くは非推奨コード、またはhigerの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;
次のコード (Kotlin) は、API 21 から少なくとも現在の API バージョン (API 29) まで動作します。getWifiState() 関数は、WiFi ネットワーク状態の 3 つの可能な値のいずれかを返します。enum クラスで定義された Disable、EnabledNotConnected、および Connected。これにより、WiFi を有効にするか、すでに有効になっている場合は利用可能なネットワークの 1 つに接続するようにユーザーに通知するなど、より詳細な決定を行うことができます。ただし、WiFi インターフェイスがネットワークに接続されているかどうかを示すブール値だけが必要な場合は、他の関数 isWifiConnected() がそれを示します。以前のものを使用し、結果を Connected と比較します。
これは、以前の回答の一部に影響を受けていますが、Android API の進化や IP V6 の可用性のゆっくりとした増加によってもたらされた問題を解決しようとしています。秘訣は次のものを使用することでした。
wifiManager.connectionInfo.bssid != null
の代わりに:
- getIpAddress() == 0 (IP V4 でのみ有効) または
- getNetworkId() == -1 には、別の特別な権限 (場所) が必要になります。
ドキュメントによると: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssidネットワークに接続されていない場合は null を返します。また、実際の値を取得する権限がない場合でも、接続されていれば null 以外の値が返されます。
また、次の点にも留意してください。
Android.os.build.version_codes#nの前にリリースする場合、このオブジェクトは、呼び出しプロセス内のメモリリークを回避するための他の派生コンテキストからではなく、コンテキスト#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)
}
}