Is there a way to check whether tethering is active?
Asked Answered
A

2

7

can I check programmaticall wheter the android device has tethering activated?

I just watched the WifiManager class. All vatraibles from the WifiInfo show the same values as iff the WIFI is turned off on the device.

Thnaks, best regards

Aliphatic answered 4/11, 2011 at 9:48 Comment(1)
The tethering functionality is in the ConnectivityManager class, but hidden and not in the public API. If you intend to use the "unpublished API" you're going to need a modified framework JAR or use reflection. The method you're looking for is probably String[] ConnectivityManager#getTetheredIfaces(), which returns the currently tethered network interfaces.Marquee
A
8

Try using reflection, like so:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for(Method method: wmMethods){
if(method.getName().equals("isWifiApEnabled")) {

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

(It returns a Boolean)


As Dennis suggested it is better to use this :

    final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled");
    method.setAccessible(true); //in the case of visibility change in future APIs
    return (Boolean) method.invoke(manager);

(manager is the WiFiManager)

Aliber answered 4/11, 2011 at 10:2 Comment(1)
There is no need to iterate all declared methods: the Class class have "getDeclaredMethod" method. Check out the code in my answer.Volcanism
V
10

First, you need to get WifiManager:

Context context = ...
final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

Then:

public static boolean isSharingWiFi(final WifiManager manager)
{
    try
    {
        final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled");
        method.setAccessible(true); //in the case of visibility change in future APIs
        return (Boolean) method.invoke(manager);
    }
    catch (final Throwable ignored)
    {
    }

    return false;
}

Also you need to request a permission in AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Volcanism answered 6/12, 2013 at 19:29 Comment(4)
What is the purpose of all the finals? Are these required in some instances?Wound
@diedthreetimes: "What is the purpose of all the finals? Are these required in some instances?"—Coding style, each to their own. See should I use final and final abuse.Brandebrandea
A little addition: one should check if the "getSystemService" returned null.Volcanism
Does not work for me. I am getting an error: "Expected receiver of type android.net.wifi.WifiManager, but got java.lang.reflect.Method"List
A
8

Try using reflection, like so:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
Method[] wmMethods = wifi.getClass().getDeclaredMethods();
for(Method method: wmMethods){
if(method.getName().equals("isWifiApEnabled")) {

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

(It returns a Boolean)


As Dennis suggested it is better to use this :

    final Method method = manager.getClass().getDeclaredMethod("isWifiApEnabled");
    method.setAccessible(true); //in the case of visibility change in future APIs
    return (Boolean) method.invoke(manager);

(manager is the WiFiManager)

Aliber answered 4/11, 2011 at 10:2 Comment(1)
There is no need to iterate all declared methods: the Class class have "getDeclaredMethod" method. Check out the code in my answer.Volcanism

© 2022 - 2024 — McMap. All rights reserved.