Определить USB-модем на Android - PullRequest
8 голосов
/ 22 сентября 2011

Есть ли какой-нибудь способ (программно) узнать в вашей активности / приложении, что пользователь включил USB-модем на своем телефоне?

Ответы [ 5 ]

8 голосов
/ 20 октября 2011

Вы также можете использовать отражение, чтобы получить доступ к скрытой функции для настройки USB-модема.Вот мой код.

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

Чтобы отключить USB-модем, вам просто нужно изменить имя метода отражения "getTetherableIfaces" на "getTetherIfaces", изменить "tether" на "untether".

Пожалуйста, проверьте.

3 голосов
/ 22 сентября 2011

Просмотр документации Settings.System указывает на отсутствие ответа, это невозможно сделать.

Ссылка на указанную документацию

1 голос
/ 11 мая 2017

Это должно работать на всех телефонах, подтверждено на некоторых устройствах Android 7,6 и 5;

Метод: интерфейс rndisX (обычно rndis0) отображается только при включенном usb-модеме.

Пример кода:

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;
}
1 голос
/ 18 ноября 2015

Вот решение для прослушивания изменений состояния привязки:

Сначала вы должны быть знакомы с BroadcastReceiver.вы можете найти много учебников (google: как прослушать изменения подключения ...)

Чтобы получить обновление состояния Tethering, вам нужно использовать скрытое действие фильтра Android (см. ConnectivityManager)

и в вашем классе BroadcastReceiver:

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

затем зарегистрируйте фильтр в свой BroadcastReceiver:

myApplicationContext.registerReceiver(this, filter);

в вашем методе onReceive (конечный контекст, конечное намерение)информация Intent.extras содержит 3 массива, заполненных соответствующим привязанным сетевым интерфейсом: erroredArray / availableArray / activeArray

Немного сложно, но вы можете получить информацию о состоянии привязки.

Кроме тогоВы можете поразмышлять о скрытой функции кода Android:

Поиск getTetherableIfaces() в диспетчере подключений.

Вот ссылка: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java#L1604

0 голосов
/ 04 июня 2013

Я обнаружил, что если я проверяю сетевой интерфейс usb0, он имеет IP-адрес только после настройки привязки.

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