java - 无法从 WifiP2pDeviceList 获取设备

标签 java android wireless wifi-direct wifip2p

我只是想实现 Wifi P2P,但我一直在获取对等列表。 当我点击发现设备按钮时,我只想获取所有设备,将设备列表附加到一个字符串,我可以使用 TextView 输出该字符串。

主 Activity .java

package com.example.lrmah.wifip2p;


public class MainActivity extends AppCompatActivity implements 
WifiP2pManager.PeerListListener {

private List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>();
WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
BroadcastReceiver mReceiver;
Button B;
TextView t;


IntentFilter mIntentFilter;

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

    t=(TextView) findViewById(R.id.displayTextView);
    B=(Button) findViewById(R.id.discoverPeers);

    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);

    B.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
                @Override
                public void onSuccess() {
                    Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(int reasonCode) {
                }
            });

        }
    });




}

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(mReceiver, mIntentFilter);
}


/* unregister the broadcast receiver */
@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mReceiver);
}

@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
    List<WifiP2pDevice> refreshedPeers = (List<WifiP2pDevice>) peerList.getDeviceList();
    if (!refreshedPeers.equals(peers)) {
        peers.clear();
        peers.addAll(refreshedPeers);
    }

    WifiP2pDevice device= refreshedPeers.get(0);
    t.setText(device.deviceName);
    if (peers.size() == 0) {
        return;
    }
}}

WifiDirectBroadcastReceiver

package com.example.lrmah.wifip2p;


public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {

private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private MainActivity mActivity;
WifiP2pManager.PeerListListener myPeerListListener;

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) {
            Toast.makeText(mActivity,"wifi is on",Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(mActivity,"Please turn on wifi",Toast.LENGTH_LONG).show();
        }
    } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
        if (mManager != null) {
            mManager.requestPeers(mChannel, mActivity);
        }
    }
    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
    }
}}

我可能错了,但我认为没有调用 onPeerAvailable。

最佳答案

几点:

  1. else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { //在这里你应该调用

    NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
    
    if (networkInfo.isConnected() && isSender) {
        // connected with the other device, request connection info to find group owner IP
        manager.requestConnectionInfo(channel, yourWifiP2pManager.ConnectionInfoListene);
    }
    
  2. else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { //在这里调用 discoverPeers

    manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            if (manager != null) {
                manager.requestPeers(channel, yourWifiP2pManager.PeerListListener);
            }
        }
        @Override
        public void onFailure(int reasonCode) {}
    });
    
  3. 那么设备列表会在

    中广播
    else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
        WifiP2pDeviceList list = intent.getParcelableExtra(WifiP2pManager.EXTRA_P2P_DEVICE_LIST);
        for (WifiP2pDevice d : list.getDeviceList()) { //...
    

关于java - 无法从 WifiP2pDeviceList 获取设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48143818/

相关文章:

java - 忽略证书验证 - Tomcat8 WebSocket (JSR-356)

ipad - 适用于 CentOS 的 iPad 应用程序的无线分发

java : How to determine the correct charset encoding of a stream

java - 将图像加载到 ImageView 中会导致 "I/Choreographer: Skipped 139 frames! The application may be doing too much work on its main thread."错误

android - traceview无故崩溃

Android 应用内购买问题

linux - 非 root 访问 ioctl 进行 WIFI 扫描

wireless - Airodump 未将握手写入文件

java - itext 将 PDF 分割成多个 PDF,但大小相同

java - SimpleDateFormat 显示错误的本地时间