ฉันต้องการออกแบบแอพที่แสดงรายการเครือข่าย Wi-Fi ที่มีอยู่และเชื่อมต่อกับเครือข่ายใดที่ผู้ใช้เลือก
ฉันใช้ส่วนที่แสดงผลการสแกน ตอนนี้ฉันต้องการเชื่อมต่อกับเครือข่ายที่เลือกโดยผู้ใช้จากรายการผลการสแกน
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันต้องการออกแบบแอพที่แสดงรายการเครือข่าย Wi-Fi ที่มีอยู่และเชื่อมต่อกับเครือข่ายใดที่ผู้ใช้เลือก
ฉันใช้ส่วนที่แสดงผลการสแกน ตอนนี้ฉันต้องการเชื่อมต่อกับเครือข่ายที่เลือกโดยผู้ใช้จากรายการผลการสแกน
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณต้องสร้างWifiConfiguration
ตัวอย่างเช่นนี้:
String networkSSID = "test";
String networkPass = "pass";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\""; // Please note the quotes. String should contain ssid in quotes
จากนั้นสำหรับเครือข่าย WEP คุณต้องทำสิ่งนี้:
conf.wepKeys[0] = "\"" + networkPass + "\"";
conf.wepTxKeyIndex = 0;
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
สำหรับเครือข่าย WPA คุณจะต้องเพิ่มข้อความรหัสผ่านดังนี้:
conf.preSharedKey = "\""+ networkPass +"\"";
สำหรับเครือข่ายแบบเปิดคุณต้องทำสิ่งนี้:
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
จากนั้นคุณต้องเพิ่มลงในการตั้งค่าตัวจัดการ wifi ของ Android:
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
wifiManager.addNetwork(conf);
และสุดท้ายคุณอาจต้องเปิดใช้งานดังนั้น Android จึงเชื่อมต่อกับมัน:
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();
break;
}
}
UPD: ในกรณีของ WEP หากรหัสผ่านของคุณเป็น hex คุณไม่จำเป็นต้องล้อมด้วยเครื่องหมายคำพูด
คำตอบก่อนหน้านี้ทำงานแต่การแก้ปัญหาจริงได้ง่าย ไม่จำเป็นต้องวนลูปผ่านรายการเครือข่ายที่กำหนดค่าเนื่องจากคุณได้รับรหัสเครือข่ายเมื่อคุณเพิ่มเครือข่ายผ่าน WifiManager
ดังนั้นโซลูชันที่สมบูรณ์และเรียบง่ายจะมีลักษณะดังนี้:
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = String.format("\"%s\"", ssid);
wifiConfig.preSharedKey = String.format("\"%s\"", key);
WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
//remember id
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
CHANGE_WIFI_STATE
จำเป็นต้องได้รับอนุญาต
ก่อนที่จะเชื่อมต่อเครือข่าย WIFI คุณต้องตรวจสอบประเภทความปลอดภัยของเครือข่าย WIFI ScanResult ระดับที่มีความสามารถ ฟิลด์นี้ให้ประเภทเครือข่ายของคุณ
อ้างอิง: https://developer.android.com/reference/android/net/wifi/ScanResult.html#capabilities
เครือข่าย WIFI มีสามประเภท
ก่อนอื่นยกตัวอย่างวัตถุ WifiConfiguration และกรอก SSID ของเครือข่าย (โปรดทราบว่าจะต้องอยู่ในเครื่องหมายคำพูดคู่) ตั้งค่าสถานะเริ่มต้นเป็นปิดใช้งานและระบุลำดับความสำคัญของเครือข่าย (ตัวเลขประมาณ 40 ดูเหมือนจะทำงานได้ดี)
WifiConfiguration wfc = new WifiConfiguration();
wfc.SSID = "\"".concat(ssid).concat("\"");
wfc.status = WifiConfiguration.Status.DISABLED;
wfc.priority = 40;
ตอนนี้สำหรับส่วนที่ซับซ้อนมากขึ้น: เราจำเป็นต้องกรอกข้อมูลสมาชิก WifiConfiguration หลายรายเพื่อระบุโหมดความปลอดภัยของเครือข่าย สำหรับเครือข่ายเปิด
wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wfc.allowedAuthAlgorithms.clear();
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
สำหรับเครือข่ายที่ใช้ WEP โปรดทราบว่าคีย์ WEP ยังอยู่ในเครื่องหมายคำพูดคู่
wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
if (isHexString(password)) wfc.wepKeys[0] = password;
else wfc.wepKeys[0] = "\"".concat(password).concat("\"");
wfc.wepTxKeyIndex = 0;
สำหรับเครือข่ายที่ใช้ WPA และ WPA2 เราสามารถกำหนดค่าเดียวกันสำหรับทั้ง
wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wfc.preSharedKey = "\"".concat(password).concat("\"");
ในที่สุดเราสามารถเพิ่มเครือข่ายไปยังรายการที่รู้จัก WifiManager
WifiManager wfMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int networkId = wfMgr.addNetwork(wfc);
if (networkId != -1) {
// success, can call wfMgr.enableNetwork(networkId, true) to connect
}
มอบเครดิตให้แก่ @ raji-ramamoorthi & @kenota
วิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันคือการรวมกันของผู้ให้ข้อมูลด้านบนในชุดข้อความนี้
การได้มาScanResult
ที่นี่เป็นกระบวนการ
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifi.isWifiEnabled() == false) {
Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled", Toast.LENGTH_LONG).show();
wifi.setWifiEnabled(true);
}
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
wifi.getScanResults();
}
};
แจ้งให้ทราบเกี่ยวกับunregister
มันonPause
และonStop
มีชีวิตอยู่นี้unregisterReceiver(broadcastReceiver);
public void connectWiFi(ScanResult scanResult) {
try {
Log.v("rht", "Item clicked, SSID " + scanResult.SSID + " Security : " + scanResult.capabilities);
String networkSSID = scanResult.SSID;
String networkPass = "12345678";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\""; // Please note the quotes. String should contain ssid in quotes
conf.status = WifiConfiguration.Status.ENABLED;
conf.priority = 40;
if (scanResult.capabilities.toUpperCase().contains("WEP")) {
Log.v("rht", "Configuring WEP");
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
if (networkPass.matches("^[0-9a-fA-F]+$")) {
conf.wepKeys[0] = networkPass;
} else {
conf.wepKeys[0] = "\"".concat(networkPass).concat("\"");
}
conf.wepTxKeyIndex = 0;
} else if (scanResult.capabilities.toUpperCase().contains("WPA")) {
Log.v("rht", "Configuring WPA");
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
conf.preSharedKey = "\"" + networkPass + "\"";
} else {
Log.v("rht", "Configuring OPEN network");
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
conf.allowedAuthAlgorithms.clear();
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
}
WifiManager wifiManager = (WifiManager) WiFiApplicationCore.getAppContext().getSystemService(Context.WIFI_SERVICE);
int networkId = wifiManager.addNetwork(conf);
Log.v("rht", "Add result " + networkId);
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : list) {
if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
Log.v("rht", "WifiConfiguration SSID " + i.SSID);
boolean isDisconnected = wifiManager.disconnect();
Log.v("rht", "isDisconnected : " + isDisconnected);
boolean isEnabled = wifiManager.enableNetwork(i.networkId, true);
Log.v("rht", "isEnabled : " + isEnabled);
boolean isReconnected = wifiManager.reconnect();
Log.v("rht", "isReconnected : " + isReconnected);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
หากอุปกรณ์ของคุณรู้การกำหนดค่า Wifi (จัดเก็บไว้แล้ว) เราสามารถเลี่ยงวิทยาศาสตร์จรวดได้ ตรวจสอบ SSID ว่าตรงกันหรือไม่ ถ้าเป็นเช่นนั้นการเชื่อมต่อและการกลับมา
ตั้งค่าการอนุญาต:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
การเชื่อมต่อ
try {
String ssid = null;
if (wifi == Wifi.PCAN_WIRELESS_GATEWAY) {
ssid = AesPrefs.get(AesConst.PCAN_WIRELESS_SSID,
context.getString(R.string.pcan_wireless_ssid_default));
} else if (wifi == Wifi.KJ_WIFI) {
ssid = context.getString(R.string.remote_wifi_ssid_default);
}
WifiManager wifiManager = (WifiManager) context.getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> wifiConfigurations = wifiManager.getConfiguredNetworks();
for (WifiConfiguration wifiConfiguration : wifiConfigurations) {
if (wifiConfiguration.SSID.equals("\"" + ssid + "\"")) {
wifiManager.enableNetwork(wifiConfiguration.networkId, true);
Log.i(TAG, "connectToWifi: will enable " + wifiConfiguration.SSID);
wifiManager.reconnect();
return null; // return! (sometimes logcat showed me network-entries twice,
// which may will end in bugs)
}
}
} catch (NullPointerException | IllegalStateException e) {
Log.e(TAG, "connectToWifi: Missing network configuration.");
}
return null;
ฉันยากที่จะเข้าใจว่าทำไมคำตอบของคุณสำหรับ WPA / WPA2 ไม่ทำงาน ... หลังจากพยายามหลายชั่วโมงฉันพบสิ่งที่คุณหายไป:
conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
จำเป็นสำหรับเครือข่าย WPA !!!!
ตอนนี้มันใช้งานได้ :)
นี่เป็นกิจกรรมที่คุณสามารถคลาสย่อยเพื่อบังคับให้เชื่อมต่อกับ wifi เฉพาะ: https://github.com/zoltanersek/android-wifi-activity/blob/master/app/src/main/java/com/zoltanersek/androidwifiactivity/ WifiActivity.java
คุณจะต้อง subclass กิจกรรมนี้และใช้วิธีการ:
public class SampleActivity extends WifiBaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected int getSecondsTimeout() {
return 10;
}
@Override
protected String getWifiSSID() {
return "WifiNetwork";
}
@Override
protected String getWifiPass() {
return "123456";
}
}
ในระดับ API 29 WifiManager.enableNetwork()
วิธีการที่เลิกใช้งานแล้ว ตามเอกสาร Android API (ตรวจสอบที่นี่ ):
- ดู WifiNetworkSpecifier.Builder # build () สำหรับกลไกใหม่ในการกระตุ้นการเชื่อมต่อกับเครือข่าย Wi-Fi
- ดู addNetworkSuggestions (java.util.List), removeNetworkSuggestions (java.util.List) สำหรับ API ใหม่เพื่อเพิ่มเครือข่าย Wi-Fi เพื่อพิจารณาเมื่อเชื่อมต่อกับ wifi อัตโนมัติ หมายเหตุความเข้ากันได้: สำหรับแอปพลิเคชันที่กำหนดเป้าหมายเป็น Build.VERSION_CODES.Q ขึ้นไป API นี้จะส่งคืนค่าเท็จเสมอ
ระดับ API ที่ 29 เพื่อเชื่อมต่อกับเครือข่ายอินเตอร์เน็ตไร้สาย, WifiNetworkSpecifier
คุณจะต้องใช้ คุณสามารถค้นหารหัสตัวอย่างได้ที่https://developer.android.com/reference/android/net/wifi/WifiNetworkSpecifier.Builder.html#build ()
ฉันพยายามเชื่อมต่อกับเครือข่าย ไม่มีคำตอบใด ๆ ที่นำเสนอข้างต้นสำหรับ hugerock t70 ฟังก์ชั่น wifiManager.disconnect (); ไม่ได้ตัดการเชื่อมต่อจากเครือข่ายปัจจุบัน ดังนั้นจึงไม่สามารถเชื่อมต่อกับเครือข่ายที่ระบุได้อีกครั้ง ฉันได้แก้ไขโค้ดด้านบน สำหรับฉันรหัส bolow ทำงานอย่างสมบูรณ์:
String networkSSID = "test";
String networkPass = "pass";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\"";
conf.wepKeys[0] = "\"" + networkPass + "\"";
conf.wepTxKeyIndex = 0;
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
conf.preSharedKey = "\""+ networkPass +"\"";
WifiManager wifiManager =
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
int networkId = wifiManager.addNetwork(conf);
wifi_inf = wifiManager.getConnectionInfo();
/////important!!!
wifiManager.disableNetwork(wifi_inf.getNetworkId());
/////////////////
wifiManager.enableNetwork(networkId, true);
UID nnnnn does not have permission to update configuration xxxx. MD_START_CONNECT but no requests and connected, but app does not have sufficient permissions, bailing.
ลองวิธีนี้ มันง่ายมาก:
public static boolean setSsidAndPassword(Context context, String ssid, String ssidPassword) {
try {
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
Method getConfigMethod = wifiManager.getClass().getMethod("getWifiApConfiguration");
WifiConfiguration wifiConfig = (WifiConfiguration) getConfigMethod.invoke(wifiManager);
wifiConfig.SSID = ssid;
wifiConfig.preSharedKey = ssidPassword;
Method setConfigMethod = wifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
setConfigMethod.invoke(wifiManager, wifiConfig);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}