问题描述
我的代码流程是 - 发现、连接、检查连接信息。下面是逻辑顺序相同的代码-
manager.discoverPeers(channel,new wifip2pManager.ActionListener() {
@Override
public void onSuccess() {
tvstatus.setText("Status - discovering peers...");
}
@Override
public void onFailure(int reasonCode) {
//**ISSUE 1**
//Timer delay of 5-10 seconds. Then discovering again.
manager.discoverPeers(channel,new wifip2pManager.ActionListener() {
@Override
public void onSuccess() { // }
@Override
public void onFailure(int reason) { // }
});
}
});
//NEXT POPULATING PEERS LIST
peerListListener = new wifip2pManager.PeerListListener() {
@Override
public void onPeersAvailable(wifip2pDeviceList devList) {
Toast.makeText(PeersIntent.this,"Inside onPeersAvailable",Toast.LENGTH_SHORT).show();
//***DOESNT EVEN MAKE IT IN HERE***
//Populating list view
}
};
//CONNECTING TO PEER BASED ON LIST VIEW ITEM CLICK. Hiding this code block because discovery itself fails.
//NEXT CONNECTION INFO LISTENER
connectionInfoListener = new wifip2pManager.ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(wifip2pInfo info) {
final InetAddress groupOwnerAddress = info.groupOwnerAddress;
if(info.groupFormed && info.isGroupOwner)
{//}
else if(info.groupFormed)
{//}
if(WiFiDirectbroadcastReceiver.disconnected)
{
//**ISSUE 2**
//INDICATED IN CODE BLOCK BELOW
}
}
};
我的 WiFiDirectbroadcastReceiver 类定义为 official docs -
if (wifip2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
// Respond to new connection or disconnections
if(manager != null)
{
NetworkInfo networkInfo = intent.getParcelableExtra(wifip2pManager.EXTRA_NETWORK_INFO);
if(networkInfo.isConnected())
{
manager.requestConnectionInfo(channel,PeersIntent.connectionInfoListener);
}
else
{
Toast.makeText(context,"Device disconnected",Toast.LENGTH_LONG).show();
disconnected = true; //a public status variable
//**ISSUE 2**
}
}
我的清单文件(我也在运行时检查和请求权限)-
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
->问题 1(在代码中指出)- 发现失败,代码为 2。所以我等待 10 秒钟以确保它不忙,然后重试。还是一样的问题。
->问题 2(在代码中指出)- 每次我在关闭和打开 wifi 后重新运行应用程序时,广播类都会断开连接。
->问题 3 - 即使 discoverPeers()
返回 onSuccess()
,发现似乎也不起作用。 PeerListListener()
永远不会进入覆盖的 onPeersAvailable()
。
我正在 Pixel 2 (Pie) 和 Pixel 3a (R) 模拟器上试用代码,并获得位置许可。我不知道我做错了什么或哪里出错了。要么 logcat 对我没有太大帮助,要么我读错了。
我哪里出错了/我可以做些什么不同的事情?
解决方法
来自 WifiP2pManager 的文档:
当应用程序需要获取当前节点列表时,它可以通过 requestPeers(WifiP2pManager.Channel,WifiP2pManager.PeerListListener) 请求节点列表。当对等列表可用时,PeerListListener#onPeersAvailable 将与设备列表一起调用。
您应该在广播接收器中收听 WIFI_P2P_PEERS_CHANGED_ACTION
以请求对等方,requestConnectionInfo()
用于在已建立组后请求信息。请务必查看sample project。