2016-09-30 25 views
2

我在这里有一个奇怪的问题。使用java连接到adhoc wifi或手动执行它的区别

我正在制作一个应用程序,可以从相机连接到无线adhoc网络。 (所以没有互联网连接的无线网络)。

这里是Java代码我使用,能够自动将Android手机连接到相机的WiFi:

WifiConfiguration conf = new WifiConfiguration(); 
    conf.SSID = "\"" + networkSSID + "\""; 
    conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 

    wifiManager.addNetwork(conf); 
    LocalBroadcastManager.getInstance(context).registerReceiver(mWifiScanReceiver, new IntentFilter(TAG_WIFI_CONNECTED)); 

    List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); 
    for(WifiConfiguration i : list) { 
     if(i.SSID != null && i.SSID.contains(networkSSID)) { 
      if (old_networkId != i.networkId && wifiManager.getConnectionInfo() != null) 
       old_networkId = wifiManager.getConnectionInfo().getNetworkId(); 
      wifiManager.disconnect(); 
      sicilia_ssid = networkSSID; 

      wifiManager.enableNetwork(i.networkId, true); 
      wifiManager.reconnect(); 
      break; 
     } 
    } 

此代码的工作:该设备不连接到WiFi网络我想,但:

这里的问题是

我使用一个特定的API与相机对话。 如果我使用此代码连接到无线网络,API将不起作用。但如果我手动连接到无线(与设置应用程序),没有问题... 如果我禁用蜂窝数据,我可以使用代码自动连接到相机。 因此,它看起来像蜂窝数据优先于特定的无线网络,但只有当连接是在Java代码...

那么两种方式之间的区别是什么? 我是否需要添加更多代码? 非常感谢!

回答

1

我找到了解决办法here

“从棒棒糖起OS变得有点更加智能化,让多个网络连接,而不是将数据路由到不具有Internet连接的网络”

所以我一旦建立连接,添加此代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     Network current_network = null; 
     for (Network n : cm.getAllNetworks()) 
     { 
      if (cm.getNetworkInfo(n).getTypeName().equals("WIFI")) { 
       current_network = n; 
       break; 
      } 
     } 

     if (current_network != null) 
     { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
       cm.bindProcessToNetwork(current_network); 
      else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       ConnectivityManager.setProcessDefaultNetwork(current_network); 
      } 
     } 
    } 
相关问题