2011-09-22 21 views

risposta

3

Guardare attraverso le Impostazioni. La documentazione del sistema punta alla risposta come no, non è possibile farlo.

Link to said documentation

+0

non è forse possibile anche da utilizzando java.lang.reflection?Ho raggiunto il controllo dello stato di Wifi Tethering usando quello ... ma per l'USB non riesco a capirlo. –

7

è anche possibile utilizzare la reflection per accedere alla funzione nascosta per impostare tethering USB. Ecco il mio codice.

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!"); 

Per disabilitare il tethering USB, è solo bisogno di cambiare le riflessione nome del metodo "getTetherableIfaces" a "getTetheredIfaces", il cambiamento "tether" a "untether".

Si prega di controllare.

+0

non funziona in Android 4.0 –

+0

Dovrebbe essere ovvio, ma questo è ovviamente un modo non standard di farlo, di cui uno sviluppatore dovrebbe essere a conoscenza, quindi lo dico comunque. –

+0

non funziona su dispositivi Samsung – Neji

0

Ho scoperto che se controllo l'interfaccia di rete usb0 , ha solo un indirizzo IP una volta impostato il tethering.

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

Questo doent work. Anche dopo aver saputo di avere il tethering attivo e funzionante, ho ancora il messaggio "Tethering non abilitato" – javawocky

1

Ecco una soluzione per ascoltare i cambiamenti di stato tethering:

Per prima cosa è necessario avere familiarità con BroadcastReceiver. potete trovare un sacco di tutorial (Google: come ascoltare per le modifiche di connettività ...)

Al fine di ottenere l'aggiornamento dello stato Tethering, è necessario utilizzare un'azione di filtro nascosta di Android (vedi ConnectivityManager)

e nella classe BroadcastReceiver:

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

quindi registrare il filtro al BroadcastReceiver:

myApplicationContext.registerReceiver(this, filter); 

sul tuo OnReceive (contesto contesto finale, intento Intent finale) il metodo, le informazioni Intent.extras contiene 3 matrici riempiti con la corrispondente interfaccia di rete tethered: erroredArray/availableArray/activeArray

E 'un po' difficile, ma si può ottenere le informazioni sullo stato del tethering.

Inoltre, si può fare qualche riflessione sulla funzione nascosta del codice di Android:

Cerca getTetherableIfaces() nel Gestore di connettività.

Questo è il link: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

1

Questo dovrebbe funzionare su tutti i telefoni, confermate su alcuni Android 7,6 e 5 dispositivi;

Metodo: l'interfaccia rndisX (in genere rndis0) viene visualizzata solo quando il tethering USB è abilitato.

Esempio di codice:

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; 
}