强制 Android 应用连接到某个 WiFi 网络

Posted

技术标签:

【中文标题】强制 Android 应用连接到某个 WiFi 网络【英文标题】:Force Android app to connect to a certain WiFi network 【发布时间】:2019-02-07 23:30:18 【问题描述】:

我正在构建一个连接到某个无法访问互联网的 WiFi 网络的应用程序,我通过应用程序(而不是通过设置)添加了网络配置,以便能够启用/禁用此网络。

应用程序的工作原理如下:

1-用户按下按钮。

2-我检查是否启用了 WiFi,如果没有,我启用它。 另外,如果手机已经连接到 WiFi 网络,我会断开它与该网络的连接并连接到我的(这工作正常)。

3-我使用以下方法连接网络(启用WiFi后):

mWifiManager.enableNetwork(networkId, true);//I have the network ID from the list of configured networks.
mWifiManager.reconnect();

但是如果 WiFi 最初被禁用,这似乎不起作用,WiFi 被启用但并不总是连接到我的网络,它有时会连接到其他配置的网络(如果可用)。

我尝试为我的网络提供高优先级(高于所有其他配置的网络),但没有任何区别。

我也尝试在启用 WiFi 之前启用网络,但没有成功。

我尝试添加一个 mWifiManager.disconnect();但没有变化。

mWifiManager.disonnect();
mWifiManager.enableNetwork(networkId, true);
mWifiManager.reconnect();

所以我有一些问题:

Q1-为什么当你已经连接到 WiFi 网络时它可以工作,但如果 WiFi 被禁用则不能工作?

Q2-是否有任何可行的方法来强制应用连接到特定网络?(我正在使用 android 7.0 API 24)。

这是我的代码:

int mID;
String mSSID;
String mPASSWORD;
public void connectToWiFi(String ssid, String key) 
    mSSID = ssid;
    mPASSWORD = key;
    if (!mWifiManager.isWifiEnabled()) 
        WifiUtils.withContext(mContext).enableWifi(this::enableResult);
        //Also tried 
       // boolean wifiEnabled = mWifiManager.setWifiEnabled(true);
      return;
    
    connectToNetwork();


private void enableResult(boolean b)  //This is to make sure WiFi has been enabled successfully
    Log.w(TAG, "enableResult:" + b);

    if (b) 
        connectToNetwork();
    


private void connectToNetwork() 
    mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);// also tried to store the id in shared prefs and get it back here (did not work for me)
    mID = getExistingNetworkId(mSSID);
    if (mID == -1) //Network has not been configured yet, so I add it
        mID = addNetworkToConfiguration();
        MyApplication.getInstance().getShared().setNetowrkID(mID);// store the id in shred prefs 
        mWifiManager.saveConfiguration();
    
    boolean disconnect = mWifiManager.disconnect();
    boolean result = mWifiManager.enableNetwork(mID, true);
    boolean reconnect = mWifiManager.reconnect();


private int addNetworkToConfiguration() 
    WifiConfiguration config = new WifiConfiguration();
    config.SSID = quoted(mSSID);
    config.status = WifiConfiguration.Status.ENABLED;
    config.preSharedKey = quoted(mPASSWORD);
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    assignHighestPriority(config);
    return mWifiManager.addNetwork(config);
 

 private int getExistingNetworkId(String SSID) 
    mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) 
        for (WifiConfiguration existingConfig : configuredNetworks) 
            if (areEqual(trimQuotes(existingConfig.SSID), trimQuotes(SSID))) 
                return existingConfig.networkId;
            
        
    else 
        Log.e(TAG,"Unable to fetch network configurations");
    
    return -1;
private void assignHighestPriority(WifiConfiguration config) 
    List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) 
        for (WifiConfiguration existingConfig : configuredNetworks) 
            if (config.priority <= existingConfig.priority) 
                config.priority = existingConfig.priority + 1;
            
        
    

【问题讨论】:

您找到解决方案了吗? 【参考方案1】:

Q1)我认为您必须将此指令添加到您的代码中才能重新启用 wifi: mWifiManager.setWifiEnabled(true);

Q2)我不知道除了你发布的方法之外如何强制wifi

【讨论】:

以上是关于强制 Android 应用连接到某个 WiFi 网络的主要内容,如果未能解决你的问题,请参考以下文章

在没有网络访问的本地 wifi 上强制 Android 使用 3G

如果通过应用程序连接到 WIFI,则无法在 Android 上发送 http 请求

Android getActiveNetwork 总是返回 null

如何在android中检查网络是不是连接到wifi [重复]

在 android 上使用 pyjnius 连接到 wifi 网络

以编程方式将设备连接到android中的同一wifi网络?