Google 的 Direct WiFi Demo 删除发现按钮

Google's Direct WiFi Demo remove discovery button

我的应用程序需要使用 WiFi Direct,我找到了 Google 的演示,但它需要进行很多很多更改。我遇到的第一个问题是我无法让应用程序自动扫描设备,因为到处都是碎片,每次我尝试使用 Runnable 创建一个无限循环并将​​该循环放入第二个线程中,所以 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();

我对代码感到抱歉,因为它 post 真的很乱而且很长一段时间 post 但我想说清楚

我会放弃代码,重新设计 class 来进行发现。基本上你需要做的是实现广播接收器来知道什么时候发生不同的事情,例如:

  • WIFI_P2P_PEERS_CHANGED_ACTION 告诉您您周围的同行的同行发现信息已更改
  • WIFI_P2P_DISCOVERY_CHANGED_ACTION 告诉您对等发现状态已更改

因此,如果您只想发现点,那么在开始时只需调用 discoverPeers,一旦 WIFI_P2P_DISCOVERY_CHANGED_ACTION 被调用,查看它是否关闭,然后再次调用 discoverPeers。

一旦你得到 WIFI_P2P_PEERS_CHANGED_ACTION ,只需调用 requestPeers 来获取对等点列表。

当然,如果您还想在这些对等点上发现服务,则需要稍微修改一下逻辑,无论如何,我的 WifiServiceSearcher.java 示例代码很好地说明了逻辑。