2016-01-06 3 views
1

сообщество, это мой первый вопрос, поэтому, пожалуйста, скажите мне, если я случайно не соглашусь с некоторыми нормами или похожими.Android WiFi Direct android.net.wifi.p2p.PEERS_CHANGED получил бесконечно

Я пытаюсь закодировать приложение для Android, которое связывается с WiFi напрямую. Все работает гладко в этой точке, но мой 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 код. Все остальное прекрасно работает, и у меня нет идей, это началось из ниоткуда.

ответ

0

Вот как это работает. В основном, что вам следует делать, это вызвать requestPeers с вашим экземпляром WifiP2pManager. Затем вы получите onPeersAvailable из WifiP2pManager.PeerListListener, который будет вызываться с массивом сверстников, и вы могли бы проверить, является ли изменение тем, что вы хотите сообщить.

эталонная реализация может быть найдена из моего github projects

+0

Итак, просто чтобы быть уверенным, получая СВЕРСТНИКИ ИЗМЕНЕНО каждые несколько секунд, это нормально, и я должен просто справиться с этим, глядя, если что-то изменилось для меня? EDIT: спасибо за быстрый ответ и ссылку! –

Смежные вопросы