Включение USB-модема программно - есть приложение, которое сделало это для 2.3 - PullRequest
8 голосов
/ 28 марта 2012

Я прочитал много вопросов здесь о SO, которые спрашивают, как включить USB-модем программным способом.

Ответ всегда один и тот же, обычные приложения не могут этого сделать, только системные приложения.

Тем не менее, для 2.3 вы можете скачать приложение на рынке, которое сделает это за вас.

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

В ICS (Android 4.0.3) оно больше не работает.

Как они сделали это для 2.3?Возможно ли это и для 4.0?

Ответы [ 6 ]

8 голосов
/ 05 июня 2012

используя следующий код, вы можете включить 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();
                        }
                    }
                }
        }
6 голосов
/ 31 августа 2012

ICS и выше: Для выполнения метода отражения приложению потребуется разрешение WRITE_SECURE_SETTINGS.

Недоступно, если телефон не рутирован.

2 голосов
/ 04 февраля 2013

, так как это одна из самых популярных страниц в результатах 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));
        }
    }
}
1 голос
/ 18 июня 2014

Порт «rndis0» включен динамически, недоступен в списке интерфейсов Tetherable.Он добавляется, когда пользователь выбирает в меню опцию USB Tethering.Функция ConnectivityManager :: setUsbTethering (bool) вызывается при выборе опции.И этот вызов функции разрешен только для системных приложений.

1 голос
/ 11 марта 2013

В Samsumg Galaxy Tab 2 10.1 интерфейс называется не «usb0», а «rndis0».Может быть, это то же самое для Galaxy SII

0 голосов
/ 02 апреля 2018

Я знаю, что это старая ветка, но я надеюсь, что это может помочь другим людям в будущем,

Этот код работал для меня в Android 4.4 (с привилегиями root)

code: хитрость заключается в использовании отражения, метод, который изменяет usb-тетринг, называется "setUsbTethering"

Я не напишу весь класс, но вот что вам нужно:

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 = "android.uid.system"

  2. добавить защищенное разрешение на запись <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"

  3. Подпишите apk с помощью ключа сертификата Google ( apk-with-system-privileges ) и нажмите его в / system / app

Помните, что usb-модем включенЕсли USB подключен, то более удачным решением будет зарегистрировать как USB_STATE, так и USB_ATTACH и соответственно включить / отключить его в методе onReceive.(USB-модем автоматически отключается при отключении USB)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...