7

如何从我的应用程序启动或停止 Android 2.2 中的内置网络共享?

4

4 回答 4

8

There is a non-public Tethering API in the ConnectivityManager. As shown above you can use reflection to access it. I tried this on a number of Android 2.2 phones, and it works on all of them (my HTC turns on tethering but does NOT show this in the status bar..., so check from the other end). Below is some rough code which emits debugging stuff and turns on tethering on usb0.

ConnectivityManager cman = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

Method[] methods = cman.getClass().getDeclaredMethods();
for (Method method : methods) {
    if (method.getName().equals("getTetherableIfaces")) {
        try {
            String[] ifaces = (String[]) method.invoke(cman);
            for (String iface : ifaces) {
                Log.d("TETHER", "Tether available on " + iface);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if (method.getName().equals("isTetheringSupported")) {
        try {
            boolean supported = (Boolean) method.invoke(cman);
            Log.d("TETHER", "Tether is supported: " + (supported ? "yes" : "no"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if (method.getName().equals("tether")) {
        Log.d("TETHER", "Starting tether usb0");
        try {
            int result = (Integer) method.invoke(cman, "usb0");
            Log.d("TETHER", "Tether usb0 result: " + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Please note: this code requires the following permissions to work:

android.permission.ACCESS_NETWORK_STATE
android.permission.CHANGE_NETWORK_STATE
于 2013-02-07T15:34:44.540 回答
3

我在这里回答了这个问题。简而言之,有可能,代码如下:

private void setWifiTetheringEnabled(boolean enable) {
    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

    Method[] methods = wifiManager.getClass().getDeclaredMethods();
    for (Method method : methods) {
        if (method.getName().equals("setWifiApEnabled")) {
            try {
                method.invoke(wifiManager, null, enable);
            } catch (Exception ex) {
            }
            break;
        }
    }
}

您的应用应具有以下权限:

android.permission.CHANGE_WIFI_STATE

于 2012-11-28T06:17:59.123 回答
0

Android SDK 中没有用于管理网络共享的公共 API——抱歉!

于 2010-08-08T22:22:59.217 回答
0

我使用了来自Android 如何以编程方式在 Android 中打开热点的代码!我为 android 4.2 启用了便携式热点。这是代码。

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
// TODO Auto-generated method stub
WifiConfiguration wifi_configuration = null;
wifiManager.setWifiEnabled(false);

try 
{
  //USE REFLECTION TO GET METHOD "SetWifiAPEnabled"
Method method=wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
method.invoke(wifiManager, wifi_configuration, true);
} 
catch (NoSuchMethodException e){
// TODO Auto-generated catch block
  e.printStackTrace();
}catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
 e.printStackTrace();
}catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
于 2013-09-20T10:05:42.293 回答