web-dev-qa-db-ja.com

WIFIが接続されているときにSSIDを取得する

AndroidデバイスがWIFIに接続されているときに、WIFIネットワークのSSIDを取得しようとしています。

Android.net.wifi.supplicant.CONNECTION_CHANGEをリ​​ッスンするBroadcastReceiverを登録しました。 WIFIが切断または再接続されたときに通知を受け取ります。残念ながら、ネットワークのSSIDを取得できません。

次のコードを使用してSSIDを見つけています。

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

SSIDの代わりに、文字列 <unknown ssid> が返されます。

これらはマニフェスト内のアクセス許可です(確認のためにACCESS_NETWORK_STATEを追加しましたが、実際には必要ありません)

<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>

なぜこれが起こるのですか?実際のSSIDを取得するにはどうすればよいですか?接続が確立される前に、ブロードキャストは早期に開始されますか?聴きたい別の放送はありますか?興味があるのはWIFI接続だけで、3G接続には興味がありません。

更新:チェックしたところ、wifiInfo.getBSSID()はnullを返します。

52
zmbq

ブロードキャストレシーバーでWifiManager.NETWORK_STATE_CHANGED_ACTIONをリッスンします

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
        NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
        if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {

NetInfo.isConnected()を確認します。その後、私は使用することができます

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();
String ssid  = info.getSSID();

UPDATE

Android 8.0以降では、GPSがオンになっていない限り、接続されたネットワークのSSIDを取得できません。

85
Eric Woodruff

Android 8.1(API 27)以降、WifiInfo.getSSID()またはWifiInfo.getBSSID()から結果を取得するには、アプリにACCESS_COARSE_LOCATION(またはACCESS_FINE_LOCATION)権限を付与する必要があります。

この権限は、WifiManager.getConnectionInfo()およびWifiManager.getScanResults()から結果を取得するためにも必要ですが、これが8.1で新しく追加されたのか、以前必要だったのかは不明です。

ソース :「BSSID/SSIDを使用して場所を推測できるため、WifiManager.getConnectionInfo()を使用して要求されたこれらのWifiInfoフィールドへのアクセスには、WifiManager.getScanResults()と同じ場所のアクセス許可が必要です。」

46
mike47

ブロードキャストレシーバーを作成したくない場合は、簡単に試してください

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo;

wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
    ssid = wifiInfo.getSSID();
}

ユーザーが新しいSSIDに切断または接続するたびに、またはWiFiの状態が変化するたびに、WifiInfoを初期化する必要があることを覚えておいてください。つまり、wifiInfo = wifiManager.getConnectionInfo();

30
Pranav

現在接続されているWifi APのSSIDを取得する興味深いソリューションを見つけました。繰り返しWifiManager.getConfiguredNetworks()を使用し、特定のWifiInfo.getNetworkId()で構成を見つける必要があります。

私の例

アクションWifiManager.NETWORK_STATE_CHANGED_ACTIONを持つブロードキャストレシーバーで、意図から現在の接続状態を取得しています

NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
nwInfo.getState()

NetworkInfo.getStateNetworkInfo.State.CONNECTEDと等しい場合、現在のWifiInfoオブジェクトを取得できます

WifiManager wifiManager = (WifiManager) getSystemService (Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo ();

それとその後

public String findSSIDForWifiInfo(WifiManager manager, WifiInfo wifiInfo) {

    List<WifiConfiguration> listOfConfigurations = manager.getConfiguredNetworks();

    for (int index = 0; index < listOfConfigurations.size(); index++) {
        WifiConfiguration configuration = listOfConfigurations.get(index);
        if (configuration.networkId == wifiInfo.getNetworkId()) {
            return configuration.SSID;
        }
    }

    return null;
}

この方法は非常に重要ですロケーションもロケーション許可も必要ありません

13
TomMannson

Android 8.1では、SSIDを取得するためにロケーションをオンにする必要があります。そうでない場合、接続状態は取得できますがSSIDは取得できません

WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = null;
if (wifiManager != null) 
wifiInfo = wifiManager.getConnectionInfo();
 String ssid = null;
if (wifiInfo != null) 
ssid = wifiInfo.getSSID(); /*you will get SSID <unknown ssid> if location turned off*/
5
user3143487

これは、@ EricWoodruffによる回答のフォローアップです。

netInfogetExtraInfo()を使用してwifi SSIDを取得できます。

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals (action)) {
    NetworkInfo netInfo = intent.getParcelableExtra (WifiManager.EXTRA_NETWORK_INFO);
    if (ConnectivityManager.TYPE_WIFI == netInfo.getType ()) {
        String ssid = info.getExtraInfo()
        Log.d(TAG, "WiFi SSID: " + ssid)
    }
}

BroadcastReceiverを使用していない場合は、 this と答えてContextを使用してSSIDを取得します

これはAndroid Oreo 8.1.0でテストされています

3
Yaswant Narayan