Google的Direct WiFi Demo删除了发现按钮

时间:2015-09-01 17:23:50

标签: android runnable wifi-direct

我需要使用我的应用程序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();

我为代码感到抱歉,因为它发布的内容非常混乱,而且对于长篇文章也是如此,但我想要清楚

1 个答案:

答案 0 :(得分:1)

我会抛弃代码,并重新设计类以进行发现。基本上你需要做的是实现广播接收器以了解何时发生不同的事情,例如:

  • 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示例代码很好地说明了逻辑。