2016-09-24 2 views
7

Ich habe folgendes BroadcastRecevier:Erhalten Sie SSID von getrennten WiFi-Netzwerk in Android mit BroadcastReceiver?

public class WiFiConnectionEventsReceiver extends BroadcastReceiver { 

    private static final String TAG = WiFiConnectionEventsReceiver.class.getSimpleName(); 

    @Override 
    public void onReceive(Context context, @NonNull Intent intent) { 
     Log.v(TAG, "action: " + intent.getAction()); 
     Log.v(TAG, "component: " + intent.getComponent()); 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      for (String key : extras.keySet()) { 
       Log.v(TAG, "key [" + key + "]: " + 
         extras.get(key)); 
      } 
     } else { 
      Log.v(TAG, "no extras"); 
     } 

     ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      Log.d("NetworkInfo", "Have Wifi Connection"); 
      Log.d("NetworkInfo", netInfo.getExtraInfo()); 
      Log.d("NetworkInfo", netInfo.getTypeName()); 
     } 
     else { 
      Log.d("NetworkInfo", "Don't have Wifi Connection"); 
      Log.d("NetworkInfo", netInfo.getExtraInfo()); 
      Log.d("NetworkInfo", netInfo.getTypeName()); 
     } 

     WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
     Log.d("WifiInfo", wifiManager.getConnectionInfo().toString()); 
    } 
} 

Er empfängt die Netzwerkverbindung und Trennung Veranstaltungen.

Wenn es zu einem WiFi-Netzwerk verbindet, kann ich die SSID des Netzwerks leicht erhalten.

Aber ich möchte in der Lage sein, die SSID des WiFi-Netzwerkes zu bekommen, wenn das Netzwerk ebenfalls getrennt ist (ohne zuvor verbundene Netzwerke speichern und dann auf diese Weise anpassen etc.). Ist das möglich?

Logs, wenn WiFi verbindet:

V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE 
V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} 
V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "SKY123”, roaming: false, failover: false, isAvailable: true] 
V/WiFiConnectionEventsReceiver: key [networkType]: 1 
V/WiFiConnectionEventsReceiver: key [inetCondition]: 100 
V/WiFiConnectionEventsReceiver: key [extraInfo]: "SKY123” 
D/NetworkInfo: Have Wifi Connection 
D/NetworkInfo: "SKY123” 
D/NetworkInfo: WIFI 
D/WifiInfo: SSID: SKY123, BSSID: 10:40:03:ad:6x:c9, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -79, Link speed: 43Mbps, Frequency: 2412MHz, Net ID: 1, Metered hint: false, score: 60 

Logs, wenn WiFi trennt (Anmerkung unbekannt SSID):

V/WiFiConnectionEventsReceiver: action: android.net.conn.CONNECTIVITY_CHANGE 
V/WiFiConnectionEventsReceiver: component: ComponentInfo{com.example.test/com.example.test.WiFiConnectionEventsReceiver} 
V/WiFiConnectionEventsReceiver: key [networkInfo]: [type: WIFI[], state: DISCONNECTED/DISCONNECTED, reason: (unspecified), extra: <unknown ssid>, roaming: false, failover: false, isAvailable: true] 
V/WiFiConnectionEventsReceiver: key [networkType]: 1 
V/WiFiConnectionEventsReceiver: key [inetCondition]: 0 
V/WiFiConnectionEventsReceiver: key [extraInfo]: <unknown ssid> 
V/WiFiConnectionEventsReceiver: key [noConnectivity]: true 
D/NetworkInfo: Don't have Wifi Connection 
D/NetworkInfo: id 
D/NetworkInfo: MOBILE 
D/WifiInfo: SSID: <unknown ssid>, BSSID: <none>, MAC: 02:00:00:00:00:00, Supplicant state: COMPLETED, RSSI: -127, Link speed: -1Mbps, Frequency: -1MHz, Net ID: -1, Metered hint: false, score: 0 

Der Grund, warum ich diese Informationen möchten ist, ich will ein in der Lage sein zu verfolgen WLAN-Nutzung des Nutzers in jedem Netzwerk - die Verbindungs- und Verbindungszeiten.

Ohne die SSID des abgezogenen Netzwerkes, die einzige Möglichkeit, die ich denken kann, dies zu tun, ist so etwas wie:

if (WiFi network ABC disconnected) 
    if (if previous stored connection for WiFi network ABC has no disconnection time) 
     set WiFI network ABC disconnection time to now 

jedoch der obige Ansatz fühlt sich flockig, zum Beispiel, was aus irgendeinem Grunde, wenn ein WiFi Verbindungsereignis wird verpasst usw.

Antwort

0

Dies ist nicht möglich. Wenn onReceive angerufen wird, ist die Verbindung bereits verloren und die aktuellen Informationen zeigen, dass keine Verbindung besteht.

Beachten Sie auch, dass Sie möglicherweise einen weiteren Anruf an onRecieve erhalten, direkt nachdem Sie die Verbindungsinformationen erhalten haben. Von spec:

CONNECTIVITY_ACTION

[...]

Wenn dies eine Verbindung, die das Ergebnis der Failover von einem nicht verbundenen Netzwerk war, dann ist die FAILOVER_CONNECTION boolean Extras auf true gesetzt.

Wenn der Connectivity Manager versucht, eine Verbindung zu einem anderen Netzwerk herzustellen (oder bereits eine Verbindung mit einem anderen Netzwerk hergestellt hat), wird die NetworkInfo für das neue Netzwerk auch als Extra weitergegeben. Dadurch können alle Empfänger der Übertragung wissen, dass sie dem Benutzer nicht unbedingt mitteilen sollten, dass kein Datenverkehr möglich ist. Stattdessen sollte der Empfänger bald eine weitere Übertragung erwarten, die entweder angibt, dass der Failover-Versuch erfolgreich war (und daher immer noch Datenkonnektivität besteht) oder dass der Failover-Versuch fehlgeschlagen ist, was bedeutet, dass die gesamte Verbindung verloren gegangen ist.

[...]

1

Sie können es auf jeden Fall tun, indem Sie einen anderen Ansatz als das, was Sie versucht haben.

  1. Sie müssen einen Empfänger registrieren, der auf hört.
  2. Wenn Sie einen WLAN-Scan durchführen, wird dieser Receiver mit den Scan-Ergebnissen aufgerufen. Innerhalb dieser Ergebnisse haben Sie einen beliebigen Router SSID (unabhängig von seinem verbundenen Status)
  3. Sie müssen dann die Verbindung abgleichen Wifi hast du mit der Scan-Liste auf deinem Code gefunden.

diese Berechtigungen zu Ihrem Manifest hinzufügen, und vergessen Sie nicht, wenn Sie Eibisch mit sind, request permission for the location.

<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_COARSE_LOCATION" /> 

Dies ist die MainActivty, werden die Ergebnisse auf dem Rundfunkempfänger empfangen.

public class MainActivity extends AppCompatActivity { 

    private WifiManager mWifiManager; 
    private List<ScanResult> mScanResults; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
     if (mWifiManager.isWifiEnabled() || 
       (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && mWifiManager.isScanAlwaysAvailable())) { 
      registerReceiver(mReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     } 
    } 

    private BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
       mScanResults = mWifiManager.getScanResults(); 
       for (ScanResult result : mScanResults) { 
        Log.i(getClass().getSimpleName(), "wifi Ssid : " + result.SSID); 
       } 
      } 
     } 
    }; 

    @Override 
    protected void onDestroy() { 
     try { 
      unregisterReceiver(mReceiver); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     super.onDestroy(); 
    } 
} 
+0

Ich würde vorschlagen, so etwas zu verwenden. Es ist jedoch keine Garantie, dass es sich um eine Verbindung handelt, die zuvor nicht verbunden war und nur auf den verfügbaren Wifis angezeigt wird. –

+0

Sie haben Recht, aber nachdem Sie diese Liste erhalten haben, können Sie die BSSID jedes Elements mit dem getrennten Wifi vergleichen. Es wird es vielleicht nicht immer finden, aber zu einem großen Teil wird es das tun. – Dus

0

Sobald die Verbindung verloren gegangen ist, ist sie verloren.

Der einzige Weg, wie Sie es tun könnten, ist es zu der Zeit zu protokollieren, oder speichern Sie es mit so etwas wie gemeinsame Einstellungen, so dass Sie dann den Namen der zuletzt verbundenen Wifi erhalten können.

Die Verwendung der suggestion here garantiert nicht, dass Sie das letzte verbundene WLAN sehen, da es keine Garantie gibt, dass das WLAN immer noch verfügbar ist, insbesondere wenn die Verbindung unterbrochen wurde.

Verwandte Themen