使用java连接到adhoc wifi或手动操作之间的区别

时间:2016-09-30 14:19:37

标签: java android wifi adhoc

我有一个奇怪的问题。

我正在制作一款从相机连接到无线adhoc网络的应用。 (所以wifi中没有互联网连接。)

这是我使用的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与相机对话。 如果我使用此代码连接到wifi,API将无法正常工作。但如果我手动连接到wifi(使用设置应用程序),没有问题... 如果我禁用手机数据,我可以使用该代码自动连接到相机。 因此看起来蜂窝数据优先于adhoc wifi,但只有在java代码中建立连接时...

那两种方式有什么区别? 我需要添加更多代码吗? 非常感谢你!

1 个答案:

答案 0 :(得分:1)

我找到了解决方案here

“从Lollipop开始,操作系统变得更加智能,允许多个网络连接,而不是将数据路由到没有互联网连接的网络”

所以我在连接完成后添加了这段代码:

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);
            }
        }
    }