Wifiが接続/切断した場合、クラスはどのコードを自動的にコードをチェックするために実装する必要がありますか?
私は手動でwifi接続/切断を確認できますが、毎回Android設定からWIFIを接続/切断し、結果を得るためにプログラムを実行する必要があります。
私の現在のコードは次のように簡単です:
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled()==true)
{
tv.setText("You are connected");
}
else
{
tv.setText("You are NOT connected");
}
実際には、Wi-Fiがenabledであるかどうかをチェックしていますが、それは必ずしもconnected。これは、電話機のWi-Fiモードが有効になっており、Wi-Fiネットワークに接続できることを意味します。
これは、ブロードキャストレシーバーで実際のWi-Fi接続をリッスンしている方法です。
public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMan.getActiveNetworkInfo();
if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI)
Log.d("WifiReceiver", "Have Wifi Connection");
else
Log.d("WifiReceiver", "Don't have Wifi Connection");
}
};
アクティブなネットワーク情報にアクセスするには、次のuses-permissionをAndroidManifest.xmlに追加する必要があります。
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
そして、次のインテントレシーバー(またはプログラムで追加することもできます...)
<!-- Receive Wi-Fi connection state changes -->
<receiver Android:name=".WifiReceiver">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
編集:Lollipopでは、ユーザーが未測定のネットワーク接続に接続したときにアクションを実行しようとしている場合、ジョブスケジューリングが役立つ場合があります。ご覧ください: http://developer.Android.com/about/versions/Android-5.0.html#Power
編集2:別の考慮事項は、私の答えはあなたがインターネットに接続していることをチェックしないことです。サインインが必要なWi-Fiネットワークに接続できます。以下に便利な「IsOnline()」チェックを示します。 https://stackoverflow.com/a/27312494/1140744
BroadcastReceiverを拡張する独自のクラスを作成...
public class MyNetworkMonitor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Process the Intent here
}
}
AndroidManifest.xmlで
<receiver
Android:name=".MyNetworkMonitor" >
<intent-filter>
<action Android:name="Android.net.wifi.STATE_CHANGE" />
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Intentの使用の説明については、 WIFI_STATE_CHANGED_ACTION および CONNECTIVITY_ACTION を参照してください。
Javadocの次の2つのページを確認してください。 ConnectivityManager
WiFiManager
それぞれがブロードキャストアクションを定義していることに注意してください。ブロードキャストレシーバーの登録についてさらに学習する必要がある場合は、これを確認してください。 プログラムでブロードキャストレシーバーを登録する
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled()) {
tv.setText("You are connected");
} else {
tv.setText("You are NOT connected");
}
}
};
そして、マニフェストで次のようなことができます(コードでレシーバーを登録したくない場合):
<application Android:icon="@drawable/icon" Android:label="@string/app_name">
<receiver Android:name=".WiFiReceiver" Android:enabled="true">
<intent-filter>
<action Android:name="Android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
</intent-filter>
</receiver>
</application>
編集:
アプリの実行中にのみブロードキャストを受信する必要がある場合は、マニフェストではなくコードでこのブロードキャストレシーバーを登録する方が良いと付け加えます。マニフェストで指定することにより、以前に実行されていなかった場合でも、プロセスに接続の変更が通知されます。
AndroidManifest.xmlに次の権限を追加します。
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
新しいReceiverクラスを作成します。
public class ConnectionChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null
&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show();
}
}
そして、そのレシーバークラスをAndroidManifest.xmlファイルに追加します。
<receiver Android:name="ConnectionChangeReceiver"
Android:label="NetworkConnection">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
Sabsabへの応答。 Connectivity Changeブロードキャストレシーバーに接続するために、warbiの答えを利用し、静的メソッドを含むクラスを追加しました。
public class WifiHelper
{
private static boolean isConnectedToWifi;
private static WifiConnectionChange sListener;
public interface WifiConnectionChange {
void wifiConnected(boolean connected);
}
/**
* Only used by Connectivity_Change broadcast receiver
* @param connected
*/
public static void setWifiConnected(boolean connected) {
isConnectedToWifi = connected;
if (sListener!=null)
{
sListener.wifiConnected(connected);
sListener = null;
}
}
public static void setWifiListener(WifiConnectionChange listener) {
sListener = listener;
}
}
次に、上記の最初の回答でレシーバークラスを変更しました。
public class ConnectivityReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMan.getActiveNetworkInfo();
if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI)
{
Log.d("WifiReceiver", "Have Wifi Connection");
WifiHelper.setWifiConnected(true);
} else
{
Log.d("WifiReceiver", "Don't have Wifi Connection");
WifiHelper.setWifiConnected(false);
}
}
}
最後に、アクティビティでリスナーを追加して、このコールバックを利用できます。
wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING);
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange()
{
@Override
public void wifiConnected(boolean connected)
{
//Do logic here
}
});
コールバックが発生した後にリスナーが削除されることに注意してください。これは静的リスナーであるためです。とにかく、この実装は私のために機能し、あなたのアクティビティにフックする1つの方法であり、どこでも静的です。