【问题标题】:How to connect to pre-configured Wifi in Android?如何在 Android 中连接到预配置的 Wifi?
【发布时间】:2013-12-26 19:29:59
【问题描述】:

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

我在 SO:How do I connect to a specific Wi-Fi network in Android programmatically?

上查看了诸如此类的答案

我看到你必须配置一个网络,手动输入密码,并将其添加到配置的网络列表等。

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

附带说明,这两个函数都是 WifiManager 类的一部分。希望这一切都有意义!

【问题讨论】:

    标签: java android wifi connect


    【解决方案1】:
    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 行中的字符串“您的 SSID”更改为您要连接的 SSID。

    并在清单中添加此权限:

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

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

    【讨论】:

    • 如何指定密钥 WEP/WPA?
    • 代码能够连接到保存的 wifi,但在 2 到 3 秒后切换回最初连接的网络。你能指导一下吗?
    【解决方案2】:

    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>
    

    【讨论】:

      【解决方案3】:

      连接到现有配置的主要问题是,您使用 SSID 密钥查找现有网络,这不是网络的唯一密钥。您可以在家中拥有 2 个具有相同 SSID 的不同网络,或者网络密码可能会从上次更改,您的设备已连接到该网络。如果您的应用程序针对低于 6.0,那么您可以更新保存的配置,如果没有,那么您有问题,您必须创建新的 WifiConfiguration 并保存它。

      Android 开发者谈 Android 6.0 的变化:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2012-08-03
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多