2014-03-14 13 views
5

Ich aktivieren Wi-Fi-Tethering über meine Anwendung in meinem Android-Gerät. Wie erhalte ich Benachrichtigungen in meiner Anwendung, wenn sich jemand mit dem von meiner Anwendung angebundenen Wi-Fi-Netzwerk verbindet? Muss ich mich für bestimmte Rundfunkempfänger registrieren?Wie erhalte ich eine Benachrichtigung, wenn ein Gerät eine Verbindung zu Ihrem Android Wifi-Tethering-AP herstellt?

Ich habe unter dem Quellcode der Anwendung eingefügt

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
((ToggleButton) findViewById(R.id.toggle_tethering)).setOnCheckedChangeListener(this); 
} 

@Override 

public void onCheckedChanged(CompoundButton button, boolean isChecked) { 

    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
    Boolean result = false; 
    WifiConfiguration config = new WifiConfiguration(); 
    config.SSID = "Tab3OpenWifi"; 
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
    String setWifiApConfigurationMethodName = "setWifiApConfiguration"; 
    Method setWifiApConfigurationMethod = wifiManager.getClass().getMethod(setWifiApConfigurationMethodName, WifiConfiguration.class); 
    result = (Boolean) setWifiApConfigurationMethod.invoke(wifiManager, config); 

    if (result) { 
     String setWifiApEnableMethodName = "setWifiApEnabled"; 
     Method setWifiApEnableMethod = wifiManager.getClass().getMethod(setWifiApEnableMethodName, WifiConfiguration.class, boolean.class); 
     String message; 
     if (isChecked) { 
     result = (Boolean) setWifiApEnableMethod.invoke(wifiManager, null, true); 
     if (result) { 
      message = "Enabling tethering successfully"; 
     } else { 
      message = "Enabling tethering failed"; 
     } 
    } else { 
     result = (Boolean) setWifiApEnableMethod.invoke(wifiManager, null, false); 
     if (result) { 
      message = "Disabling tethering successfully"; 
     } else { 
      message = "Disabling tethering failed"; 
     } 
    } 
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); 
    } else { 
    Toast.makeText(this, "Failed to update Wifi Tethering config.", Toast.LENGTH_SHORT).show(); 
    } 
} 

I unter Rundfunkempfänger verwendet, um den AP Zustand zu erhalten.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 

    @Override 

    public void onReceive(Context context, Intent intent) { 

     Log.d(TAG,"mReceiver.onReceive>>"); 
     String action = intent.getAction(); 
     if (WIFI_AP_STATE_CHANGED_ACTION.equals(action)) { 
      Log.d(TAG,"WIFI_AP_STATE_CHANGED_ACTION"); 
     } else if (ACTION_TETHER_STATE_CHANGED.equals(action)) { 
      ArrayList<String> available = intent.getStringArrayListExtra(
        EXTRA_AVAILABLE_TETHER); 
      ArrayList<String> active = intent.getStringArrayListExtra(
        EXTRA_ACTIVE_TETHER); 
      ArrayList<String> errored = intent.getStringArrayListExtra(
        EXTRA_ERRORED_TETHER); 

      Log.d(TAG,"==Available=="); 
      for(String str : available) 
       Log.d(TAG, ""+str); 

      Log.d(TAG,"==Active=="); 
      for(String str : active) 
       Log.d(TAG, ""+active); 

      Log.d(TAG,"==Error=="); 
      for(String str : errored) 
       Log.d(TAG, ""+str); 

     } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) { 

     } 
     Log.d(TAG,"mReceiver.onReceive<<"); 
    } 
}; 
+0

Im Moment verwende ich die in diesem Link erwähnte Methode, um die angeschlossenen Geräte zu holen. Anstatt jedes Mal abzufragen, möchte ich benachrichtigt werden, wenn der Client eine Verbindung herstellt. http://stackoverflow.com/questions/21522961/how-to-get-the-client-device-details-which-is-connected-to-wifi-hotspot – user2711243

Antwort

1

Ich glaube nicht, dass es eine API dafür gibt, noch irgendein Broadcast-Ereignis, das Sie hören können.

Die einzige Option, die ich mir vorstellen kann, ist der Betrieb auf einer niedrigeren Ebene, d. H. Der Kernel-Ebene. Ich bin kein Experte, aber ich überwachte die Datei /proc/net/tcp, um nach offenen Verbindungen zu suchen. Das könnte ein Ausgangspunkt für dich sein.

Ich schrieb auch eine einfache Bibliothek, wenn Sie einen Einblick bekommen möchten, wie ich es gemacht habe. Sie können es hier finden: https://github.com/dextorer/AndroidTCPSourceApp

+0

Meiner Erfahrung nach, müssen Sie jni verwenden, um die zu lesen/proc/net/tcp-Dateien, da das Lesen von Java nicht die vollständige Datei zurückgibt. Ich habe das durch Experimente herausgefunden. Dieser Stackoverflow scheint es zu bestätigen http://stackoverflow.com/questions/6632314/android-prosamatical-determine-list-of-apps-that-have-a-tcp-connection-open –