2010-08-08 5 views

Antwort

0

Es gibt keine öffentlichen APIs im Android SDK zum Verwalten des Tetherings - Entschuldigung!

3

Ich beantwortete diese Frage here. Kurz gesagt, es möglich ist, hier ist der Code:

private void setWifiTetheringEnabled(boolean enable) { 
    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 

    Method[] methods = wifiManager.getClass().getDeclaredMethods(); 
    for (Method method : methods) { 
     if (method.getName().equals("setWifiApEnabled")) { 
      try { 
       method.invoke(wifiManager, null, enable); 
      } catch (Exception ex) { 
      } 
      break; 
     } 
    } 
} 

Ihre App sollte die folgende Erlaubnis:

android.permission.CHANGE_WIFI_STATE

+0

Dies funktioniert gut .. Danke –

+0

Aber Wie überprüft man, ob der Client mit dem Gerät verbunden ist oder nicht? –

+0

Ich würde das auch gerne wissen. Und um das Tethering zu deaktivieren, würden Sie die Methode 'setWifiApDisabled' aufrufen? oder kannst du 'method.invoke (wlanManager, null, disable) verwenden;'? – SubliemeSiem

7

Es gibt einen Nicht -öffentliches Tethering-API in ConnectivityManager. Wie oben gezeigt, können Sie mit Reflection darauf zugreifen. Ich habe dies auf einer Reihe von Android 2.2-Handys versucht, und es funktioniert auf allen von ihnen (mein HTC schaltet Tethering, aber zeigt dies nicht in der Statusleiste ..., so überprüfen Sie am anderen Ende). Unten ist ein grober Code, der Debugging-Sachen aussendet und Tethering auf usb0 aktiviert.

ConnectivityManager cman = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

Method[] methods = cman.getClass().getDeclaredMethods(); 
for (Method method : methods) { 
    if (method.getName().equals("getTetherableIfaces")) { 
     try { 
      String[] ifaces = (String[]) method.invoke(cman); 
      for (String iface : ifaces) { 
       Log.d("TETHER", "Tether available on " + iface); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    if (method.getName().equals("isTetheringSupported")) { 
     try { 
      boolean supported = (Boolean) method.invoke(cman); 
      Log.d("TETHER", "Tether is supported: " + (supported ? "yes" : "no")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    if (method.getName().equals("tether")) { 
     Log.d("TETHER", "Starting tether usb0"); 
     try { 
      int result = (Integer) method.invoke(cman, "usb0"); 
      Log.d("TETHER", "Tether usb0 result: " + result); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Bitte beachten Sie:

android.permission.ACCESS_NETWORK_STATE 
android.permission.CHANGE_NETWORK_STATE 
0

ich den Code aus Android How to turn on hotspot in Android Programmatically verwendet: dieser Code die folgenden Berechtigungen zu arbeiten erfordert! und ich aktivieren den tragbaren Hotspot für Android 4.2. Hier ist der Code.

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
// TODO Auto-generated method stub 
WifiConfiguration wifi_configuration = null; 
wifiManager.setWifiEnabled(false); 

try 
{ 
    //USE REFLECTION TO GET METHOD "SetWifiAPEnabled" 
Method method=wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); 
method.invoke(wifiManager, wifi_configuration, true); 
} 
catch (NoSuchMethodException e){ 
// TODO Auto-generated catch block 
    e.printStackTrace(); 
}catch (IllegalArgumentException e) { 
    // TODO Auto-generated catch block 
e.printStackTrace(); 
}catch (IllegalAccessException e) { 
    // TODO Auto-generated catch block 
e.printStackTrace(); 
}catch (InvocationTargetException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
}