Home » Android » Detect USB tethering on android

Detect USB tethering on android

Posted by: admin June 15, 2020 Leave a comment

Questions:

Is there any way to know (pro grammatically) in your Activity/Application that the user has enabled USB tethering on his phone?

How to&Answers:

Looking through the Settings.System documentation points to the answer being no, its not possible to do this.

Link to said documentation

Answer:

you can also use reflection to access the hidden function for setting usb tethering.
Here is my code.

    ConnectivityManager cm =
        (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    Log.d(TAG,"test enable usb tethering");
    String[] available = null;
    int code=-1;
    Method[] wmMethods = cm.getClass().getDeclaredMethods();

    for(Method method: wmMethods){
      if(method.getName().equals("getTetherableIfaces")){
        try {
            available = (String[]) method.invoke(cm);
            break;
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return;
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return;
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return;
        }
      }
    }

    for(Method method: wmMethods){
          if(method.getName().equals("tether")){                  
              try {
                code = (Integer) method.invoke(cm, available[0]);


            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return;
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return;
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return;
            }
            break;
          }
    }

    if (code==0) 
        Log.d(TAG,"Enable usb tethering successfully!");
    else
        Log.d(TAG,"Enable usb tethering failed!");

For disabling usb tethering, you just need to change the reflection method name “getTetherableIfaces” to “getTetheredIfaces”, change “tether” to “untether”.

Please check.

Answer:

This should work on all phones, confirmed on some Android 7,6 and 5 devices;

Method: interface rndisX (typically rndis0) only shows up when usb tethering is enabled.

Code Example:

private static boolean isTetheringActive(Context context){
    try{
        for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();){
            NetworkInterface intf=en.nextElement();
            for(Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();){
                InetAddress inetAddress=enumIpAddr.nextElement();
                if(!intf.isLoopback()){
                    if(intf.getName().contains("rndis")){
                        return true;
                    }
                }
            }
        }
    }catch(Exception e){e.printStackTrace();}
    return false;
}

Answer:

Here is a solution to Listen for tethering state changes :

First you need to be familiar with BroadcastReceiver.
you can find a lot of tutorial (google : how to listen for connectivity changes …)

In order to get the Tethering state update, you need to use a hidden filter action of Android (see ConnectivityManager)

and in your BroadcastReceiver class :

IntentFilter filter = new IntentFilter("android.net.conn.TETHER_STATE_CHANGED");

then register the filter to your BroadcastReceiver :

myApplicationContext.registerReceiver(this, filter);

on your onReceive(final Context context,final Intent intent) method, the Intent.extras information contains 3 arrays filled with the corresponding tethered network interface :
erroredArray / availableArray / activeArray

It’s a little bit tricky but you can get the tethering status information.

In addition, you can do some reflexion on hidden function of Android code :

Search for getTetherableIfaces() in the Connectivity Manager.

Here is a link : https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

Answer:

I have found that if I check for usb0 network interface
it only has an ip address once tethering has been set up.

public static String getIPAddressUsb(final boolean useIPv4) {
    try {
        final List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (final NetworkInterface intf : interfaces) {
            if (intf.getDisplayName().startsWith("usb")) {
                final List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
                for (final InetAddress addr : addrs) {
                    final String sAddr = addr.getHostAddress().toUpperCase();
                    final boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
                    if (useIPv4) {
                        if (isIPv4) { return sAddr; }
                    } else {
                        if (!isIPv4) {
                            final int delim = sAddr.indexOf('%');
                            return delim < 0 ? sAddr : sAddr.substring(0, delim);
                        }
                    }
                }
            }
        }
    } catch (final Exception ex) {
        // for now eat exceptions
    }
    return "";
}


boolean isUsbTethered(){
String ipAddr = MipnAndroidApplication.getIPAddressUsb(true);
    if (ipAddr.length() == 0) {
        Log.i(LOG_TAG, "tethering not enabled");
    return false;
    } else {
        Log.i(LOG_TAG, "tethering enabled :)");
    return true;
    }
}