2015-05-05 3 views
1

Я работаю над приложением, которое выполняет только некоторые безопасные операции, когда приложение подключено к мобильной сети передачи данных. Я пытаюсь получить приложение, чтобы заставить все это сетевой трафик по конкретной сети, так что я смотрю на эту апи вызов добавляется в уровне 21: http://developer.android.com/reference/android/net/ConnectivityManager.html#setProcessDefaultNetwork(android.net.Network)setProcessDefaultNetwork всегда возвращает false

Network[] networks = cm.getAllNetworks(); 
for (int i = 0; i < networks.length; i++) { 
      NetworkInfo netInfo = cm.getNetworkInfo(networks[i]); 
      if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 
       foundMobile = true; 
       Log.d("ANDREW", "Found potential network: setting default..."); 
       result = ConnectivityManager.setProcessDefaultNetwork(networks[i]); 
       Log.d("ANDREW", "Result: " + result); 
      } 
      if (result) { 
       Log.d("ANDREW", "Success! Restricted to: " + netInfo.toString()); 
       break; 
      } 
     } 

В основном я получаю все поддерживаемые сети для устройство, проверив их все и выяснив, являются ли какие-либо из них мобильными сетями, а затем пытается установить сеть по умолчанию. Он находит мобильную сеть, но никогда не удается установить ее как сеть по умолчанию. Результат не верн., И дальнейшие результаты:

Network defProcNetwork = ConnectivityManager.getProcessDefaultNetwork(); 

также являются равными нулю.

Я также попробовал альтернативный метод, упаковывает в сеть просто не доступен на основе другого SO ответа я увидел:

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
     NetworkRequest.Builder builder = new NetworkRequest.Builder(); 
     builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 
     builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 
     NetworkCallback networkCallback = new NetworkCallback() { 
      @Override 
      public void onAvailable(Network network) { 
       Log.d("ANDREW", "Network is available!"); 
       boolean result = ConnectivityManager.setProcessDefaultNetwork(network); 
       Log.d("ANDREW", "RESULT: " + result); 
       if (ConnectivityManager.getProcessDefaultNetwork() != null) { 
        Log.d("ANDREW", "Successfully set default network "); 
       } 
      } 
     }; 
     NetworkRequest networkRequest = builder.build(); 
     connectivityManager.requestNetwork(networkRequest, networkCallback); 
     connectivityManager.registerNetworkCallback(networkRequest, networkCallback); 

Я получаю обратный вызов isAvailable, но он по-прежнему не может установить по умолчанию сеть.

Нет сообщений журнала, с которыми можно работать, я даже посмотрел на собственный код, и нет ничего, чтобы указать, что не так. SDK не описывает каких-либо дополнительных шагов, которые я могу видеть, поэтому мой вопрос: почему это всегда возвращает false и что именно разработчик должен делать, чтобы заставить это работать? Я пробовал это как на Nexus 5, так и на Nexus 6.

+0

Для получения кредита альтернативный метод был найден здесь: http://stackoverflow.com/questions/25931334/send-request-over-mobile-data-when-wifi-is-on-android-l –

ответ

0

Я выяснил, почему он не работает, собственный код создает сокет, который также требует разрешения INTERNET. Он не указан в SDK, но вашему приложению потребуется это разрешение, чтобы установить сеть по умолчанию.

Смежные вопросы