Android Wifi Direct onPeersAvailable 没有显示任何内容

Android Wifi Direct onPeersAvailable doesn't shows anything

我正在尝试使用 Wifi Direct 开发一个简单的应用程序。问题是我无法使用 onPeersAvailable 方法获取可用对等点的列表。我尝试了提到的解决方案 here and here 但没有 luck.There 在日志中没有任何内容,尝试使用 Toast 而不是日志但屏幕上也没有显示任何内容。这是我的 Main 和 BroadCastReceiver classes.

主要Class:

public class MainActivity extends AppCompatActivity {

private final String TAG = this.getClass().toString();

WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    mChannel = mManager.initialize(this, getMainLooper(), null);
    mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);

    mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    Button btn_discover = (Button) findViewById(R.id.btn_discover);
    btn_discover.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
                @Override
                public void onSuccess() {
                    /*Toast.makeText(getApplicationContext(), "Discovery is a success.",
                            Toast.LENGTH_SHORT).show();*/
                    //startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                }

                @Override
                public void onFailure(int reasonCode) {
                    Toast.makeText(getApplicationContext(), "Discovery is a failure "+reasonCode,
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
}

/* register the broadcast receiver with the intent values to be matched */
@Override
protected void onResume() {
    super.onResume();
    registerReceiver(mReceiver, mIntentFilter);
}
/* unregister the broadcast receiver */
@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mReceiver);
}}

BroadCastReceiver class:

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
private final String LOG_TAG = this.toString();
private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private MainActivity mActivity;

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel,
                                   MainActivity activity) {
    super();
    this.mManager = manager;
    this.mChannel = channel;
    this.mActivity = activity;
}



@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
        int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
        if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
            Log.i(LOG_TAG, "Wifi Direct is enabled");
        } else {
            Log.i(LOG_TAG, "Wifi Direct is not enabled");
        }
    } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
        // request available peers from the wifi p2p manager. This is an
        // asynchronous call and the calling activity is notified with a
        // callback on PeerListListener.onPeersAvailable()
        if (mManager != null) {
            mManager.requestPeers(mChannel, new WifiP2pManager.PeerListListener() {
                @Override
                public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) {
                    Log.i(LOG_TAG, "Found some peers!!! "+wifiP2pDeviceList.getDeviceList().size());
                }
            });
        }
    } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
        // Respond to new connection or disconnections
    } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
        // Respond to this device's wifi state changing
    }
}}

我确定我的设备 (2012 Nexus 7 运行 Android 4.4.4) 支持 Wifi Direct。

我认为问题是因为您正在 "WiFiDirectBroadcastReceiver".

中创建新的 "PeerListListener"

尝试将其添加到您的主 activity 中:

public class MainActivity extends AppCompatActivity implements WifiP2pManager.PeerListListener

然后向您的 main 添加新方法 activity 以收听可用的对等方:

@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
   Log.i(LOG_TAG, "Found some peers!!! " + peerList.getDeviceList().size());
}

注意:不要忘记创建新的侦听器变量 "WiFiDirectBroadcastReceiver" 并将主 activity 作为对它的引用传递。

希望对您有所帮助。