web-dev-qa-db-ja.com

Android WIFI特定のWIFI接続が利用可能になったことを検出する方法

特定のWIFIネットワークへのネットワーク接続があることを検出する必要があります。

例:家に入ってすぐに自宅のWiFiネットワークに電話がかかってきたら、「ホームネットワークにいないので、家に接続しますか?」という通知が欲しいのですが。しかし、私は自分の特定の家にいるときだけそれが起こることを望みます。

別のネットワークではなく、特定のホームネットワークであることを確認するために、何をリッスンし、どのテストを行う必要がありますか?

27
ECH5030

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

必要なコードとは異なる限り、無料サービスについては、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" />

不必要な呼び出しを防ぐために、あなたの位置を検出したい場合にのみ、最後のもの

  • また、アプリケーションが適切に機能するためには、デバイスで利用可能なwifiが必要であることを宣言する必要があります。

AndroidManifest.xml

<uses-feature Android:name="Android.hardware.wifi" />
12
Marek Sebera

標準コードを使用して、使用可能なすべてのネットワークをリストします。

  • スキャンを開始

    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でネットワークを識別するときに魔法をかけ、行動を起こします

4
Andrei G

私のプロジェクトでもまったく同じ問題があり、解決策を見つけるのに時間がかかりました。

まず、「WiFiへの接続」は非常に抽象的なものであり、当然のことです。実際には、人々は通常以下のすべてを意味します:

  • wiFiアクセスポイントで認証された
  • アクセスポイントに関連付けられている
  • ネットワークからIPアドレスを取得しました

これらすべてのステージ(およびさらにいくつか)は、異なる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"/>
3
tazmanos