特定のWIFIネットワークへのネットワーク接続があることを検出する必要があります。
例:家に入ってすぐに自宅のWiFiネットワークに電話がかかってきたら、「ホームネットワークにいないので、家に接続しますか?」という通知が欲しいのですが。しかし、私は自分の特定の家にいるときだけそれが起こることを望みます。
別のネットワークではなく、特定のホームネットワークであることを確認するために、何をリッスンし、どのテストを行う必要がありますか?
BroadcastReceiverを使用して、wifiネットワークが変更されたことを確認できます。
BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
context.registerReceiver(broadcastReceiver, intentFilter);
BroadcastReceiverは次のようになります。特定のMACアドレスを確認するには、以下のcheckConnectedToDesiredWifi()メソッドを参照してください。
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) {
SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
if (SupplicantState.isValidState(state)
&& state == SupplicantState.COMPLETED) {
boolean connected = checkConnectedToDesiredWifi();
}
}
}
/** Detect you are connected to a specific network. */
private boolean checkConnectedToDesiredWifi() {
boolean connected = false;
String desiredMacAddress = "router mac address";
WifiManager wifiManager =
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifi = wifiManager.getConnectionInfo();
if (wifi != null) {
// get current router Mac address
String bssid = wifi.getBSSID();
connected = desiredMacAddress.equals(bssid);
}
return connected;
}
}
必要なコードとは異なる限り、無料サービスについては、Androidおよびそのようなアプリを作成するときのネットワーク/ Wifiの可能性。
http://developer.Android.com/reference/Android/net/wifi/package-summary.html
Androidでwifiが接続されているかどうかを確認する方法
現在のAndroidシステムでwifiホットスポットssidを取得する方法
Android APIを使用してAndroidからwifi-networkの名前を取得する方法?
AndroidでWifiインターフェイス名を取得
AndroidManifest.xml
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
(不必要な呼び出しを防ぐために、あなたの位置を検出したい場合にのみ、最後のもの)
AndroidManifest.xml
<uses-feature Android:name="Android.hardware.wifi" />
標準コードを使用して、使用可能なすべてのネットワークをリストします。
スキャンを開始
String connectivity_context = Context.WIFI_SERVICE;
final WifiManager wifi = (WifiManager) getSystemService(connectivity_context);
if (wifi.isWifiEnabled()) {
wifi.startScan();
}
データの受信者を登録する
IntentFilter i = new IntentFilter();
i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i) {
// TODO Auto-generated method stub
ScanWiFiActivity a = ScanWiFiActivity.instance();
WifiManager w = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> l = w.getScanResults();
a.Clear();
for (ScanResult r : l) {
//use r.SSID or r.BSSID to identify your home network and take action
a.setText(r.SSID + "" + r.level + "\r\n");
}
}
};
registerReceiver(receiver, i);
FORブロックでは、SSIDまたはBSSIDでネットワークを識別するときに魔法をかけ、行動を起こします
私のプロジェクトでもまったく同じ問題があり、解決策を見つけるのに時間がかかりました。
まず、「WiFiへの接続」は非常に抽象的なものであり、当然のことです。実際には、人々は通常以下のすべてを意味します:
これらすべてのステージ(およびさらにいくつか)は、異なるAndoidイベントに関連付けられています。したがって、これ以上苦労することなく、ここに私の(少し変更された)コードを示します。
public class MyService extends Activity { // or Service
//... Other stuff
BroadcastReceiver awaitIPAddress = null;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) {
//WiFi is associated
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
// Wifi info available (should be, we are associated)
if (wi.getIpAddress() != 0) {
// Lucky us, we already have an ip address.
// This happens when a connection is complete, e.g. after rekeying
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
} else {
// No ip address yet, we need to wait...
// Battery friendly method, using events
if (awaitIPAddress == null) {
awaitIPAddress = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent in) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
if (wi.getIpAddress() != 0) {
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
}
} else {
ctx.unregisterReceiver(this);
awaitIPAddress = null;
}
}
};
// We register a new receiver for connectivity events
// (getting a new IP address for example)
context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
}
}
} else {
// wifi connection not complete, release ip address receiver if registered
if (awaitIPAddress != null) {
context.unregisterReceiver(awaitIPAddress);
awaitIPAddress = null;
}
}
}
}
};
//... Other stuff
@Override
public void onCreate() {
super.onCreate();
//... Other stuff
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
registerReceiver(receiver, filter);
//... Other stuff
}
//... Other stuff
}
また、マニフェストに対する適切なアクセス許可を無視しないでください。
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
そして、あなたも必要だと強く思います:
<uses-permission Android:name="Android.permission.INTERNET"/>