如何在Android中连接到预配置的Wifi?

问题描述 投票:0回答:3

因此,我在自己解决这些问题时遇到了一些麻烦,而且我对 Android 还很陌生,因此非常感谢对此的一些帮助。

我已经查看了诸如此类的答案:如何以编程方式连接到 Android 中的特定 Wi-Fi 网络?

我发现您必须配置网络,手动输入密码,并将其添加到已配置网络列表中,等等。

我想知道如果用户已经配置/保存了多个 wifi,并选择一个特定的 wifi 以编程方式连接,该怎么办? 这是否意味着它们已经出现在 getConfiguredNetworks() 方法调用中?如果是这样,如何执行 .enableNetwork(int netId, boolean disableOthers) ?

顺便说明一下,这两个函数都是 WifiManager 类的一部分。希望这一切都有道理!

java android wifi
3个回答
11
投票
WifiManager wifiManager = (WifiManager)context.getSystemService(WIFI_SERVICE);              
int netId = -1;         
for (WifiConfiguration tmp : wifiManager.getConfiguredNetworks()) 
   if (tmp.SSID.equals( "\""+"Your SSID"+"\"")) 
   {
      netId = tmp.networkId;                   
      wifiManager.enableNetwork(netId, true);
   }

只需将第3行中的字符串“Your SSID”更改为您要连接的SSID即可。

并在清单中添加此权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

我对 StackOverflow 的第一个贡献,希望它对某人有所帮助:D


1
投票

连接到现有配置的主要问题是,您使用 SSID 密钥查找现有网络,该密钥不是网络的唯一密钥。您家里可能有 2 个具有相同 SSID 的不同网络,或者您的设备上次连接到该网络时网络密码可能发生更改。如果您的应用程序的目标版本低于 6.0,那么您可以更新保存的配置,如果没有,那么您就会遇到问题,您必须创建新的 WifiConfiguration 并保存它。

Android 开发者了解 Android 6.0 中的变化:

您的应用程序现在可以更改 WifiConfiguration 对象的状态,前提是您创建了这些对象。您不得修改或删除用户或其他应用程序创建的 WifiConfiguration 对象。

我发现的最佳场景是我尝试使用相同的 SSID 连接到每个已保存的网络,如果每个配置都无法连接,那么我已将新配置添加并保存到设备。


0
投票

wifiManager.enableNetwork(wifiConfiguration.networkId, true);我接受了racuevji的答案并对其进行了详细说明。需要更多权限,如果 wifi 关闭,下面的解决方案也会将其打开:

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
                if (!wifiManager.isWifiEnabled())
                {
                    MainActivity.this.registerReceiver(myWifiStateListener,
                                                       new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
                    wifiManager.setWifiEnabled(true);
                }
                connectToSSID(wifiManager, "your_ssid");
            }
        });
    }

    private void connectToSSID(WifiManager wifiManager, String ssid)
    {
        for (WifiConfiguration wifiConfiguration : wifiManager.getConfiguredNetworks())
        {
            if (wifiConfiguration.SSID.equals("\"" + ssid + "\""))
            {
                wifiManager.enableNetwork(wifiConfiguration.networkId, true);
            }
        }
    }

    private BroadcastReceiver myWifiStateListener
            = new BroadcastReceiver()
    {

        @Override
        public void onReceive(Context arg0, Intent arg1)
        {
            NetworkInfo networkInfo = arg1.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
            {
                if(networkInfo.getState()== NetworkInfo.State.CONNECTED)
                {
                    connectToSSID((WifiManager) getSystemService(WIFI_SERVICE), "pix4d_office");
                    MainActivity.this.unregisterReceiver(myWifiStateListener);
                }
            }
        }
    };
}

其中activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button" android:layout_below="@+id/textView"
        android:layout_toEndOf="@+id/textView" android:layout_marginTop="75dp"/>

</RelativeLayout>

和 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="damsoft.com.wifitest" >
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
© www.soinside.com 2019 - 2024. All rights reserved.