我需要使用我的应用程序WiFi Direct,我发现了谷歌的演示,但它需要很多很多变化。我遇到的第一个问题是我不能让应用程序自动扫描设备,因为遍布整个地方都有碎片,每次我尝试使用Runnable创建一个无限循环并将该循环放入第二个Thread中,以便UI线程可以自由运行它崩溃。你能指出我的错误并帮我删除扫描按钮吗?
我认为涉及按钮的代码如下:
case R.id.atn_direct_discover:
if (!isWifiP2pEnabled) {
Toast.makeText(WiFiDirectActivity.this, R.string.p2p_off_warning,
Toast.LENGTH_SHORT).show();
return true;
}
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
.findFragmentById(R.id.frag_list);
fragment.onInitiateDiscovery();
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(WiFiDirectActivity.this, "Discovery Initiated",
Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int reasonCode) {
Toast.makeText(WiFiDirectActivity.this, "Discovery Failed : " + reasonCode,
Toast.LENGTH_SHORT).show();
}
});
return true;
还有:
public void onInitiateDiscovery() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel", "finding peers", true,
true, new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
});
}
我尝试了很多东西,但我认为我真的很接近这样的事情:
Runnable myRunnable = new Runnable() {
@Override
public void run() {
while (testByte == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
myRunnable = new Runnable() {
@Override
public void run() {
final DeviceListFragment fragment = (DeviceListFragment) getFragmentManager()
.findFragmentById(R.id.frag_list);
fragment.onInitiateDiscovery();
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(WiFiDirectActivity.this, "Discovery Initiated",
Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int reasonCode) {
Toast.makeText(WiFiDirectActivity.this, "Discovery Failed : " + reasonCode,
Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
然后我补充说:
Thread myThread = new Thread(myRunnable);
myThread.start();
我为代码感到抱歉,因为它发布的内容非常混乱,而且对于长篇文章也是如此,但我想要清楚
答案 0 :(得分:1)
我会抛弃代码,并重新设计类以进行发现。基本上你需要做的是实现广播接收器以了解何时发生不同的事情,例如:
因此,如果你想发现只有同伴,那么在开始时只需调用discoverPeers,一旦调用WIFI_P2P_DISCOVERY_CHANGED_ACTION,看看它是否关闭,再次调用discoverPeers。
一旦获得WIFI_P2P_PEERS_CHANGED_ACTION,只需调用requestPeers获取对等列表。
当然,如果您还想在这些对等体上发现服务,您需要稍微修改一下逻辑,无论如何,我的WifiServiceSearcher.java示例代码很好地说明了逻辑。