Android WiFi Direct android.net.wifi.p2p.PEERS_CHANGED无休止地收到了

时间:2016-01-06 23:36:37

标签: android connection broadcastreceiver wifi-direct wifip2p

界, 这是我的第一个问题,所以请告诉我,如果我不小心不符合某些规范或类似的话。

我正在尝试编写与WiFi直接通信的Android应用程序。 此时一切顺利,但我的BroadcastReceiver一次又一次地收到android.net.wifi.p2p.PEERS_CHANGED动作。

public class WifiP2PBroadcastReceiver extends BroadcastReceiver {
private final static String TAG = "WifiP2PBR";
private WifiP2pManager _manager;
private WifiP2pManager.Channel _channel;
private Activity _callbackActivity;

private static ArrayList<WifiBroadcastCallback> _arrayList_callbacks;

public WifiP2PBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel, Activity callback) {
    _manager = manager;
    _channel = channel;
    _callbackActivity = callback;
}


/**
 * add a callback to the receiver
 *
 * @param callback
 */
public static void addWifiCallback(WifiBroadcastCallback callback) {
    if(!getCallbacksList().contains(callback))
    {
        getCallbacksList().add(callback);
    }
}

public void registerReceiver()
{
    Log.d(TAG,"registerReceiver called");
    if(_callbackActivity != null) {
        _callbackActivity.registerReceiver(this, getIntentFilter());
    }
}

public void unregisterReceiver() {
    if(_callbackActivity != null) {
        _callbackActivity.unregisterReceiver(this);
    }
}


@Override
public final void onReceive(Context context, Intent intent) {
    Log.d(TAG, "action: "+intent.getAction());
    switch(intent.getAction()) {
        case WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION:
            Log.d(TAG, "state changed action");
            break;
        case WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION:
            Log.d(TAG, "peers changed action");
            notifyPeerUpdate();
            break;
        case WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION:
            Log.d(TAG, "wifi p2p connection changed action");
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            Log.d(TAG,"network info available");
            break;
        case WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:
            Log.d(TAG, "wifi p2p this device changed action");
            notifyDeviceUpdate();
            WifiP2pDevice thisDevice = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
            Log.d(TAG,"this device acquired");
            break;
    }
}

private void notifyPeerUpdate()
{
    for(WifiBroadcastCallback c : getCallbacksList())
    {
        c.onPeersChanged();
    }
}

private void notifyDeviceUpdate()
{
    for(WifiBroadcastCallback c : getCallbacksList())
    {
        c.onDeviceChanged();
    }
}

/**
 * get array list of callbacks
 *
 * @return
 */
private static ArrayList<WifiBroadcastCallback> getCallbacksList() {
    if(_arrayList_callbacks == null) {
        _arrayList_callbacks = new ArrayList<WifiBroadcastCallback>();
    }
    return _arrayList_callbacks;
}

/**
 * interface for callbacks
 */
public interface WifiBroadcastCallback {
    void onDeviceChanged();

    void onPeersChanged();
}

private IntentFilter getIntentFilter()
{
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    return intentFilter;
}

}

这是我的BroadcastReceiver代码。其他一切都很好,而且我没有想法,它是从无处开始的。

1 个答案:

答案 0 :(得分:0)

这就是它的确如此有效。基本上,你应该在那里做的是用你的WifiP2pManager实例调用requestPeers。然后你可以通过WifiP2pManager.PeerListListener来查看onPeers,可以看到对等数组,然后你可以检查是否有你要报告的变化。

参考实施可以在我的github projects

中找到