所以我在为自己解决这些问题时遇到了一些麻烦,而且我对Android很新,所以非常感谢你对此有所帮助。
我已经在SO:How do I connect to a specific Wi-Fi network in Android programmatically?
上看了这些答案我发现您必须配置网络,手动输入密码,并将其添加到已配置网络列表等。
我想知道在用户已配置/保存多个wifi的情况下会做什么,并选择特定的一个以编程方式连接? 这是否意味着它们已经出现在getConfiguredNetworks()方法调用中?如果是这样,那么如何执行.enableNetwork(int netId,boolean disableOthers)?
作为旁注,这两个函数都是WifiManager类的一部分。希望这一切都有意义!
答案 0 :(得分:6)
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
答案 1 :(得分:1)
连接到现有配置的主要问题是,您要查找具有SSID密钥的现有网络,该密钥不是网络的唯一密钥。您可以在家中拥有2个具有相同SSID的不同网络,或者可能发生网络密码从上次更改后,您的设备已连接到该网络。如果您的应用程序的目标是6.0以下,那么您可以更新已保存的配置,如果没有,那么您遇到问题,您必须创建新的WifiConfiguration并保存它。
Android Developer关于Android 6.0中的更改:
您的应用程序现在只有在您创建这些对象时才能更改WifiConfiguration对象的状态。您不得修改或删除用户或其他应用程序创建的WifiConfiguration对象。
我发现最好的情况是我尝试使用相同的SSID连接到每个保存的网络,如果每个配置都无法连接,那么我已经添加并保存了新的配置到该设备。
答案 2 :(得分: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>