以编程方式启用USB网络共享 - 有一个应用程序为2.3做了它

时间:2012-03-28 18:35:08

标签: android usb

我在这里阅读了很多关于如何以编程方式启用USB网络共享的问题。

答案总是一样的,普通的应用程序无法做到,只有系统应用程序。

然而,对于2.3,你可以在市场上下载一款适合你的应用程序。

https://play.google.com/store/apps/details?id=org.tdtran.autousbtethering

在ICS(Android 4.0.3)上,它不再有效。

他们是如何为2.3做的?是否也可以用于4.0?

6 个答案:

答案 0 :(得分:8)

使用以下代码可以启用USB网络共享。我在4.0中测试过。

 public void switchOnTethering() {

                Object obj = getSystemService(Context.CONNECTIVITY_SERVICE);
                for (Method m : obj.getClass().getDeclaredMethods()) {

                    if (m.getName().equals("tether")) {
                        try {
                            m.invoke(obj, "usb0");
                        } 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();
                        }
                    }
                }
        }

答案 1 :(得分:6)

ICS及以上版本:要执行反射方法,应用程序需要WRITE_SECURE_SETTINGS权限。

除非手机已植根,否则无法使用此功能。

答案 2 :(得分:2)

因为这是本主题Google搜索结果中最受欢迎的页面之一,所以我想提供检查可用界面的代码。它适用于我拥有的姜饼手机,但不适用于我的Galaxy S3。

    // DETECT INTERFACE NAME
Log.i("UsbTethering","Detecting tetherable usb interface.");
String[] available = null;
ConnectivityManager connMgr = (ConnectivityManager)connectivityServiceObject;
Method[] wmMethods = connMgr.getClass().getDeclaredMethods();
for(Method getMethod: wmMethods)
{
    if(getMethod.getName().equals("getTetherableUsbRegexs"))
    {
        try
        {
            available = (String[]) getMethod.invoke(connMgr);
            break;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
// DETECT INTERFACE NAME


if(available.length > 0)
{       
    for(String interfaceName : available)
    {
        Log.i("UsbTethering", "Detected " + String.valueOf(available.length) + " tetherable usb interfaces.");
        Log.i("UsbTethering", "Trying to " + desiredString + " UsbTethering on interface " + interfaceName + "...");
        Integer returnCode = (Integer)method.invoke(connectivityServiceObject, interfaceName);
        if(returnCode == 0)
        {
            Log.i("UsbTethering", "UsbTethering " + desiredString + "d.");
            return true;
        }
        else
        {
            Log.w("UsbTethering", "Failed to " + desiredString + "Usb Tethering. ReturnCode of method " + method.getName() + ": " + String.valueOf(returnCode));
        }
    }
}

答案 3 :(得分:1)

在Samsung Galaxy Tab 2 10.1上,该界面不称为“usb0”,而是“rndis0”。也许Galaxy SII也是如此

答案 4 :(得分:1)

端口" rndis0"在Tetherable接口列表中动态启用不可用。 当用户选择菜单中的USB Tethering选项时,它会被添加。 选择该选项时,将调用函数ConnectivityManager :: setUsbTethering(bool)。此函数调用仅允许用于系统应用程序。

答案 5 :(得分:0)

我知道这是一个旧帖子,但我希望这可以帮助其他人,

该代码适用于Android 4.4(具有root权限)

<强>码 诀窍是使用反射,改变usb tethring的方法被称为&#34; setUsbTethering&#34;

我不会写整个班级,但这就是你需要的:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method usbTethering = connectivityManager.getClass().getMethod('setUsbTethering')
int returnCode = (Integer)usbTethering.invoke(connectivityManager, true);

0 = success

您可以使用以下代码打印整个类方法

private static void printClassMethod(@NonNull Class aClazz) {
Method[] wmMethods = aClazz.getDeclaredMethods();
  for (Method method : wmMethods) {
     Log.i('anytag', method.getName());
  }
}

然后致电printClassMethod(ConnectivityManager.class)

更多结束,你可以进入类本身并检查所需的方法和参数。

使事情有效: 您必须将您的应用设置为系统应用

  1. 在清单中声明:android:sharedUserId =&#34; android.uid.system&#34;

  2. 添加书写安全权限<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"

  3. 使用谷歌证书密钥(apk-with-system-privileges)签署apk并将其推送至/ system / app

  4. 请注意,USB连接时usbTethering已打开,因此更好的解决方案是注册USB_STATE和USB_ATTACH,并在onReceive方法中相应地启用/禁用它。 (取消USB时,USB网络共享会自动关闭)