【问题标题】:Android WifiP2pManager discovery - Unable to narrow down issueAndroid WifiP2pManager 发现 - 无法缩小问题范围
【发布时间】:2021-02-27 19:05:09
【问题描述】:

我的代码流程是 - 发现、连接、检查连接信息。下面是逻辑顺序相同的代码-

         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 对我没有太大帮助,要么我读错了。

我哪里出错了/我可以做些什么不同的事情?

【问题讨论】:

    标签: android wifi-direct wifip2p


    【解决方案1】:

    来自WifiP2pManager 的文档:

    当应用程序需要获取当前节点列表时,可以通过 requestPeers(WifiP2pManager.Channel, WifiP2pManager.PeerListListener) 请求节点列表。当对等体列表可用时,PeerListListener#onPeersAvailable 与设备列表一起调用。

    您应该在广播接收器中收听WIFI_P2P_PEERS_CHANGED_ACTION 以请求对等点,requestConnectionInfo() 用于在组已建立后请求信息。请务必查看sample project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多