2015-12-23 3 views
9

Я ищу способ подключения планшета Android 5.0 к интрасети, которая не имеет подключения к Интернету по соображениям безопасности.Как указать сеть wifi с NetworkRequest.Builder(). SetNetworkSpecifier (string)

Проблема заключается в том, что защита порталов, созданная Google в Android, с 4,4/5,0. Вызов выполняется по адресу android connectivitycheck, чтобы проверить подключение к Интернету, когда этот вызов завершился неудачей, сеть Wi-Fi отмечена как не работающая и предотвращенная. Довольно хромой.

Другие столкнулись с той же проблемой, а некоторые предлагают использовать новый API, введенные в Android 5 см: Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is useless

документация на это очень расплывчато:

NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier) 

«Интерпретация Например, Bluetooth может использовать какой-либо идентификатор устройства, в то время как WiFi может использовать ssid и/или bssid. Сотовая связь может использовать несущую spn «

Я пробовал это, и он не работает. Основная проблема заключается в том, что после использования setNetworkSpecifier() сеть не найдена. Я попытался использовать bssid (mac) и ssid точки доступа.

Похоже, фильтр работает, но неясно, как он должен работать. Если я ухожу из setNetworkSpecifier(), то вызов сети 1 найден, но определить, какой из них определить невозможно. По крайней мере, это показывает, что мой код работает.

Так что я должен здесь вводить, если ssid и bssid не работают?

Вот мой код.

private void connect(String ssid, Context context) { 
    Log.i(TAG, "try connect to! " + ssid); 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI). 
       removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED). 
       removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET 

       setNetworkSpecifier(ssid). //<--- here is the problem 
       build(); 
     ConnectivityManager.NetworkCallback callback 
      = new ConnectivityManager.NetworkCallback() { 
       @Override 
       public void onAvailable(Network network) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName()); 
       } 
      } 

      @Override 
      public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { 
       try { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps()); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { 
       try { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName()); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     Log.i(TAG, "requestNetwork "); 
     // cm.requestNetwork(nr, callback); 
     cm.registerNetworkCallback(nr, callback); 
    } 
} 

ответ

0

Прежде всего, мошенничество всегда является опцией и требует, чтобы люди меняли свои настройки в телефоне, чтобы работать с сетью. Чит идет так. Wifi-> Advanced-> Unchecked.

Однако, я уверен, что это не тот ответ, который вы ищете. Поэтому я сделал небольшое исследование для вас и нашел, что нужно. Вам нужно вызвать команду ignoreNetwork(). Чтобы узнать больше об этой команде, она находится в ACTION_CAPTIVE_PORTAL_SIGN_IN по следующей ссылке источника.

источник: http://developer.android.com/reference/android/net/ConnectivityManager.html#ACTION_CAPTIVE_PORTAL_SIGN_IN

http://developer.android.com/reference/android/net/CaptivePortal.html#ignoreNetwork()

1

Я отлажена следующий код работает на Samsung S5 (SM-G900V), API 23 (6.0.1) в Android Studio.

void inspectNetworks() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     Network[] ns = connectivity.getAllNetworks(); 
     for (Network n : ns) { 
      NetworkCapabilities c = connectivity.getNetworkCapabilities(n); 
      Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint 
     } 
    } 
} 

Я обнаружил, что сети Wi-Fi не имеют каких-либо networkSpecifier вообще:

in Android Studio Debug view, mNetworkSpecifier = null

Может networkSpecifier s для WIFI -Транспорт сетей будут реализованы в будущем ...Для записи я обнаружил, что networkSpecifierбыл установлен на 1 на этом телефоне как для существующего CELLULAR -транспортных сетей.

На данный момент это похоже на то, чтобы быть максимально конкретным при звонках до addCapability - это лучший вариант при запросе сети Wi-Fi.