2011-09-22 55 views

Trả lời

3

Xem qua Cài đặt.Tài liệu hệ thống trỏ đến câu trả lời là không, không thể thực hiện việc này.

Link to said documentation

+0

Há chẳng phải càng tốt bằng cách sử dụng thậm chí java.lang.reflection?Tôi đã đạt được tình trạng kiểm tra Wifi Tethering bằng cách sử dụng ... nhưng đối với USB tôi chỉ không thể tìm ra. –

7

bạn cũng có thể sử dụng phản ánh để truy cập chức năng ẩn cho thiết usb tethering. Đây là mã của tôi.

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

Đối với việc vô hiệu hóa USB tethering, bạn chỉ cần thay đổi phản ánh tên phương pháp "getTetherableIfaces" thành "getTetheredIfaces", thay đổi "tether" thành "untether".

Vui lòng kiểm tra.

+0

của nó không hoạt động trong Android 4.0 –

+0

Nó sẽ đi mà không nói, nhưng đây là tất nhiên một cách tiêu chuẩn không làm nó, mà một nhà phát triển nên được nhận thức, vì vậy tôi chỉ nói nó anyway. –

+0

không hoạt động trên các thiết bị samsung – Neji

0

Tôi nhận thấy rằng nếu tôi kiểm tra giao diện mạng usb0 , nó chỉ có địa chỉ ip sau khi chia sẻ kết nối đã được thiết lập.

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

Công việc này. Ngay cả sau khi tôi biết tôi đã kết nối và chạy, tôi vẫn nhận được thông báo "chia sẻ kết nối không được bật" – javawocky

1

Đây là một giải pháp cho Nghe thay đổi trạng thái chia sẻ kết nối:

Trước tiên, bạn cần phải làm quen với BroadcastReceiver. bạn có thể tìm thấy rất nhiều hướng dẫn (google: làm thế nào để lắng nghe những thay đổi khả năng kết nối ...)

Để có được bản cập nhật trạng thái Tethering, bạn cần phải sử dụng một hành động lọc ẩn của Android (xem ConnectivityManager)

và trong lớp BroadcastReceiver của bạn:

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

sau đó đăng ký các bộ lọc để BroadcastReceiver của bạn:

myApplicationContext.registerReceiver(this, filter); 

trên phương thức onReceive (bối cảnh cuối cùng của bối cảnh, ý định Intent cuối cùng), thông tin Intent.extras chứa 3 mảng được lấp đầy với giao diện mạng tethered tương ứng: erroredArray/availableArray/activeArray

Đó là một chút khó khăn nhưng bạn có thể nhận được thông tin trạng thái chia sẻ kết nối.

Bên cạnh đó, bạn có thể làm một số phản xạ về chức năng ẩn của mã Android:

Tìm kiếm getTetherableIfaces() trong quản lý kết nối.

Dưới đây là một liên kết: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

1

này nên làm việc trên tất cả các điện thoại, khẳng định trên một số Android 7,6 và 5 thiết bị;

Phương thức: giao diện rndisX (thường rndis0) chỉ hiển thị khi bật chia sẻ kết nối qua usb.

Mã số Ví dụ:

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; 
} 
Các vấn đề liên quan