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を返します。
ブロードキャストレシーバーで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を取得できません。
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()と同じ場所のアクセス許可が必要です。」
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();
現在接続されている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;
}
この方法は非常に重要ですロケーションもロケーション許可も必要ありません
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*/
これは、@ EricWoodruffによる回答のフォローアップです。
netInfo
のgetExtraInfo()
を使用して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でテストされています