我正在尝试使用Android的Wi-Fi Direct(如果您愿意,还可以使用P2P)。我认为我的两部手机之间的效果非常好,但我意识到我遇到了WifiP2pManager.discoverPeers()
和/或WifiP2pManager.requestPeers()
的问题。我观察到了这些结果:
没有发现任何对等点,并且在1分钟内没有触发回调。我也通过Android Wi-Fi设置的Wi-Fi Direct部分观察到了这一点。这很奇怪,因为有时发现几乎立即完成。
我有一个Roku设备和手机B坐在手机A旁边。虽然所有设备都连接到我的Wi-Fi,但Roku只出现~10%的时间,而手机A和B相互显示
当我从所有Wi-Fi断开两部手机并进行另一次扫描时,Roku出现了(!!!)但手机B没有出现至少十次。
< / LI>我的两部手机是Nexus 7(运行4.4.4)和Nexus 5(运行5.0)。
答案 0 :(得分:6)
我最近一直在开发一个基于WiFi Direct(使用WiFi P2P服务发现)的连接系统的应用程序,我可以肯定地说,整个事情是......的巨大痛苦。主要是因为缺乏文档,而且因为在开发基于wifi直接的解决方案时,在进行任何方法调用之前,您需要注意基本上所有内容(特别是对来自侦听器的所有回调)。
我猜是两件最烦人的事情:
UNKNOWN_ERROR
ActionListener
方法投放的无证int
(我认为-3
代码为{{1}})。这似乎是wifi守护进程本身的某种问题。唯一能阻止它发生的事情就是在你开始乱用WiFi之前重置WiFi。
您的方法调用处于错误状态 - 例如,如果您的广播接收器中未使用onFailure
收到WIFI_P2P_STATE_CHANGED_ACTION
,或者'your_device'未收到正确的WIFI_P2P_STATE_ENABLED
status
中的WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
。这通常会导致您onFailure
之一ActionListener
调用{例如ERROR
或BUSY
失败原因。
答案 1 :(得分:2)
我能够解决&#34;每隔10秒通过请求对等体发现一些手机无法出现的问题。我想我遇到了这个问题,因为一部电话总是主持人而且我没有费心去发现同伴(因为它没有试图加入他们),Wifi Direct也会睡觉主机电话。我不会对同行结果做任何事情,但它唤醒了Wifi Direct系统。这可能是一种更好的方法,但我不确定它是什么。如果我不得不猜测我说我浪费了一些电池寿命。
答案 2 :(得分:2)
根据我的经验,它是可靠的。经过大量的尝试,我得到了如此强大的可行流程:
...
wifiP2pManager.clearLocalServices(wifiP2pChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
HashMap<String, String> record = new HashMap<>();
record.put("name", "Amos");
WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo.newInstance(AppConfig.DNS_SD_SERVICE_NAME, AppConfig.DNS_SD_SERVICE_TYPE, record);
wifiP2pManager.addLocalService(wifiP2pChannel, serviceInfo, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
wifiP2pManager.setDnsSdResponseListeners(wifiP2pChannel, WifiDirectFragment.this, WifiDirectFragment.this);
wifiP2pManager.clearServiceRequests(wifiP2pChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
wifiP2pManager.addServiceRequest(wifiP2pChannel, WifiP2pDnsSdServiceRequest.newInstance(), new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
wifiP2pManager.discoverPeers(wifiP2pChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
wifiP2pManager.discoverServices(wifiP2pChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// this is my recursive discovery approach
handler.postDelayed(discoveryRunnable, AppConfig.DNS_SD_SERVICE_DISCOVERABLE_DURATION_S * 1000);
}
@Override
public void onFailure(int code) {
}
});
}
@Override
public void onFailure(int code) {
}
});
}
@Override
public void onFailure(int code) {
}
});
}
@Override
public void onFailure(int code) {
}
});
}
@Override
public void onFailure(int code) {
}
});
}
@Override
public void onFailure(int code) {
}
});
答案 3 :(得分:0)
在设备之间建立连接时,我遇到了一个很大的问题:
我想问题出在小组所有者谈判(我也尝试过更改groupOwnerIntent
参数,以强制谁应该成为小组所有者,但这没有帮助)。
那我怎么办?
我将流更改为:
mManager.createGroup(...)
),因此该设备始终是群组所有者invited
状态。