我无法通过 WIFI 连接到 WI-FI DIRECT 创建的接入点
I can't connect to the access point made by WI-FI DIRECT via WIFI
我使用 android WI-FI P2P API 创建了一个接入点,我想使用 WIFI(不是 wifi direct)和以下代码与另一个 phone 连接到它:
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\"";
conf.preSharedKey = "\""+ networkPass +"\"";
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
wifiManager.addNetwork(conf);
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;
}
}
并具有以下权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
但它没有连接到该接入点。
但是 sumsung wifi manager 可以轻松连接到它。
我尝试了很多库来连接,但结果都是一样的。
我想可能是因为接入点没有互联网连接,所以我无法连接到它。
请帮助我,我需要为我的应用程序解决这个问题。坦克
我解决了这个问题,我想与您分享解决方案。
我使用 WIFI DIRECT API 来发现接入点并检索它的信息,如密码以连接它,但我意识到当你使用 WIFI DIRECT API 来发现服务时,你无法连接到访问同时指向 WIFI(我认为这是错误)。
所以您应该先停止服务发现,然后再连接到接入点。
我使用了以下代码:
public void connectToAccessPoint(GroupAccessPoint groupAccessPoint) {
stopServiceDiscovery(new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
connect(groupAccessPoint);
}
@Override
public void onFailure(int reason) {
connect(groupAccessPoint);
}
});
}
public void stopServiceDiscovery(@Nullable WifiP2pManager.ActionListener stopDiscoveryListener) {
if (wifiP2pManager == null) return;
wifiP2pManager.clearServiceRequests(channel, new DefaultActionListener(actionListener, Action.CANCEL_DISCOVERING));
wifiP2pManager.setDnsSdResponseListeners(channel, null, null);
wifiP2pManager.stopPeerDiscovery(channel, stopDiscoveryListener);
}
private void connect(GroupAccessPoint groupAccessPoint) {
WifiUtils.withContext(activity.getApplicationContext())
.connectWith(groupAccessPoint.ssid, groupAccessPoint.password)
.setTimeout(12000)
.onConnectionResult(new ConnectionSuccessListener() {
@Override
public void success() {
actionListener.onSuccess(Action.JOIN_GROUP);
}
@Override
public void failed(@NonNull ConnectionErrorCode errorCode) {
actionListener.onFailure(Action.JOIN_GROUP);
}
}).start();
}
我使用 android WI-FI P2P API 创建了一个接入点,我想使用 WIFI(不是 wifi direct)和以下代码与另一个 phone 连接到它:
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\"";
conf.preSharedKey = "\""+ networkPass +"\"";
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
wifiManager.addNetwork(conf);
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;
}
}
并具有以下权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
但它没有连接到该接入点。
但是 sumsung wifi manager 可以轻松连接到它。
我尝试了很多库来连接,但结果都是一样的。
我想可能是因为接入点没有互联网连接,所以我无法连接到它。
请帮助我,我需要为我的应用程序解决这个问题。坦克
我解决了这个问题,我想与您分享解决方案。
我使用 WIFI DIRECT API 来发现接入点并检索它的信息,如密码以连接它,但我意识到当你使用 WIFI DIRECT API 来发现服务时,你无法连接到访问同时指向 WIFI(我认为这是错误)。
所以您应该先停止服务发现,然后再连接到接入点。
我使用了以下代码:
public void connectToAccessPoint(GroupAccessPoint groupAccessPoint) {
stopServiceDiscovery(new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
connect(groupAccessPoint);
}
@Override
public void onFailure(int reason) {
connect(groupAccessPoint);
}
});
}
public void stopServiceDiscovery(@Nullable WifiP2pManager.ActionListener stopDiscoveryListener) {
if (wifiP2pManager == null) return;
wifiP2pManager.clearServiceRequests(channel, new DefaultActionListener(actionListener, Action.CANCEL_DISCOVERING));
wifiP2pManager.setDnsSdResponseListeners(channel, null, null);
wifiP2pManager.stopPeerDiscovery(channel, stopDiscoveryListener);
}
private void connect(GroupAccessPoint groupAccessPoint) {
WifiUtils.withContext(activity.getApplicationContext())
.connectWith(groupAccessPoint.ssid, groupAccessPoint.password)
.setTimeout(12000)
.onConnectionResult(new ConnectionSuccessListener() {
@Override
public void success() {
actionListener.onSuccess(Action.JOIN_GROUP);
}
@Override
public void failed(@NonNull ConnectionErrorCode errorCode) {
actionListener.onFailure(Action.JOIN_GROUP);
}
}).start();
}