Android 2.2 wifi hotspot API
Asked Answered
D

3

24

What is the API call I need to make in Android 2.2 (Froyo) to create a Wifi hotspot (as seen in the Tethering and Portable Hotspot settings item).

Disforest answered 11/6, 2010 at 13:42 Comment(2)
I still can't believe there is no API for activating/deactivating tethering. Hope that it exists, but is just not documented yet.Morello
It is documented: androidjavadoc.com/2.3/android/net/wifi/WifiManager.html Just not part of the official API.Unaware
B
42

You can call

private boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled);

using reflection :)

after getting the WifiManager use the reflection to get the WifiManager declared methods, look for this method name setWifiApEnabled and invoke it through the WifiManager object

These API are marked as @hide, so currently you cannot use them directly, but they appear on the AIDL for the WifiManager so their are accessible!

An example can be:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for(Method method: wmMethods){
  if(method.getName().equals("setWifiApEnabled")){
    WifiConfiguration netConfig = new WifiConfiguration();
    netConfig.SSID = "\"PROVAAP\"";
    netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);    netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  

    try {
      method.invoke(wifi, netConfig,true);
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}

It works but I cannot change the current configuration with my own, and getting the current WifiConfiguration of an active AP drive me to an empty configuration.Why?

Benevolent answered 2/8, 2010 at 14:53 Comment(16)
You can always access them through reflection!Caddoan
@markov00: Your suggested approach is not part of the Android SDK. Do not use it, period.Ridley
@CommonsWare, why not? It might not work in a future version of Android, I suppose, but if you're willing to take that risk, what's wrong with that?Peepul
@MatrixFrog: Tactically, it may break on current devices. Device manufacturers are very willing to remove or alter this feature on behalf of carriers. Assuming that any non-SDK code will work, or even exist, is simply not reliable. If you want to use this code for some toy app you use on your own phone, be my guest. Only a fool will ship an application, though, that is designed to disappoint customers. Strategically, the more developers go past the SDK, the more difficult it is for me and others to convince manufacturers to not screw with stuff that's supposed to be supported in the SDK.Ridley
@CommonsWare: For embedded applications, it is perfectly ok to use a specific firmware and a specific device, and not publish the application on an app market.Edmondedmonda
I might also go with this approach (since I bundle my app with a device and am in full control of what version runs on the device). The SDK limits it's API often for no good reason - there are already many example as discussed on the Google Android dev group. Unfortunately reflection then is the only way to handle it, and I'd say go with it as long as it works for your own specific use-case.Ormazd
@markov00: is that working for your case? I tried above on SGS 2.1, but there's no method 'setWifiApEnabled' found in the loop, only found setWifiEnabled (not Ap), showApDialog, setEnabledApDialog. Another thing: How do you get/set the key? Is that in netConfig.wepKeys[0] after you invoked the method?Ormazd
@Mathias SGS 2.1 . I think the tethering is a 2.2 thing.Cato
Samsung has already implemented it in 2.1, as opposed to HTC, but it seems that the sources and methods differ.Ormazd
Is there anyway to see the implemenation of the method you are calling via reflection. For example here android.googlesource.com/platform/frameworks/base/+/… the method is not even listet.Moldy
wait,... wait... do you guys solving the case right now? I mean did the Wireless Hotspot turned on / off using this code? I didn't see where we could set it on / off from the code . @MathiasLinHepta
@PascalKlein don't know what commit you where referring to, but you can find the method in the current froyo release: android.googlesource.com/platform/frameworks/base/+/…Benevolent
@Hepta it worked the time I tested it. It's a workaround and can work on a very limited set of device, it's not meant to be used in production. On my previous comment you can see the hidden method in WifiManager. Using java reflection as I specified in the answer, and depending on your targeting device, you can enable programmatically the Wifi APBenevolent
seems i didnt see where i could set the On / Off from the code. But i found whitebyte.info/android/…. Looks similar. also omtlab.com/android-enable-disable-hotspot-programmatically @BenevolentHepta
@Hepta the last argument of invoke method provides you the ability to turn on and off the AP ---> method.invoke(wifi, null, true);Benevolent
see... other user too doesn't realize it... just like @PascalKlein . Me too, just knew it then. Thanks again markov00Hepta
G
4

this works on API 8 and above. I use a heavily different version then this below (or above), and was running into the same issue markov00 ran into; not being able to load the default WifiConfiguration for the portable Wi-Fi AP. I found a solution elsewhere.

If you like the solution, it would be nice if this was accepted as an answer

WifiManager wifi    = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods  = wifi.getClass().getDeclaredMethods();

for (Method method: wmMethods){
    if (method.getName().equals("setWifiApEnabled")){
        try {
            // just nullify WifiConfiguration to load the default configuration ;)
            method.invoke(wifi, null, true);
        } catch (IllegalArgumentException e){
            e.printStackTrace();
        } catch (IllegalAccessException e){
            e.printStackTrace();
        } catch (InvocationTargetException e){
            e.printStackTrace();
        }
    }
}
Garment answered 31/7, 2012 at 20:17 Comment(2)
So after nullifying the current one it accepts your WifiConfig?Bulbar
@dmmh, is it true by adding "method.invoke(wifi, null, true);" it is enabled. and so i just change the boolean values into "false" to turn it off? What about to check it's current state whether it is on / off?Hepta
R
2

There does not appear to be an API call to create a WiFi hotspot -- sorry!

Ridley answered 11/6, 2010 at 14:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.