我在这里阅读了很多关于如何以编程方式启用USB网络共享的问题。
答案总是一样的,普通的应用程序无法做到,只有系统应用程序。
然而,对于2.3,你可以在市场上下载一款适合你的应用程序。
https://play.google.com/store/apps/details?id=org.tdtran.autousbtethering
在ICS(Android 4.0.3)上,它不再有效。
他们是如何为2.3做的?是否也可以用于4.0?
答案 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)
更多结束,你可以进入类本身并检查所需的方法和参数。
使事情有效: 您必须将您的应用设置为系统应用
在清单中声明:android:sharedUserId =&#34; android.uid.system&#34;
添加书写安全权限<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
使用谷歌证书密钥(apk-with-system-privileges)签署apk并将其推送至/ system / app
请注意,USB连接时usbTethering已打开,因此更好的解决方案是注册USB_STATE和USB_ATTACH,并在onReceive方法中相应地启用/禁用它。 (取消USB时,USB网络共享会自动关闭)