72

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

をリッスンする BroadcastReceiver を登録しましたandroid.net.wifi.supplicant.CONNECTION_CHANGE。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 が返されます。

4

10 に答える 10

38

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

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

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

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

于 2016-01-18T07:02:37.027 に答える
15

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

私の例

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

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

NetworkInfo.getState等しい場合NetworkInfo.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;
}

そして非常に重要なことは、この方法が場所も場所の許可も必要としないことです

API29 では、Google が Wifi API を再設計したため、このソリューションは Android 10 では古くなっています。

于 2019-01-23T14:42:15.773 に答える