Detect USB tethering on android

后端 未结 5 446
Happy的楠姐
Happy的楠姐 2020-12-01 15:01

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

相关标签:
5条回答
  • 2020-12-01 15:44

    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.

    0 讨论(0)
  • 2020-12-01 15:49

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-01 15:59

    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;
    }
    
    0 讨论(0)
  • 2020-12-01 16:00

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

    Link to said documentation

    0 讨论(0)
  • 2020-12-01 16:02

    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

    0 讨论(0)
提交回复
热议问题