2015-08-15 29 views
2

的名单嘿,我根据训练样本做一个Android应用程序从developer.android.com这是我的MainActivity代码:广播意图WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION没有要求,因此没有得到同行

package com.example.hellowifi; 

    import java.util.ArrayList; 
    import java.util.HashMap; 
    import java.util.List; 
    import java.util.Map; 

    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.IntentFilter; 
    import android.net.wifi.WpsInfo; 
    import android.net.wifi.p2p.WifiP2pConfig; 
    import android.net.wifi.p2p.WifiP2pDevice; 
    import android.net.wifi.p2p.WifiP2pDeviceList; 
    import android.net.wifi.p2p.WifiP2pInfo; 
    import android.net.wifi.p2p.WifiP2pManager; 
    import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.ListView; 
    import android.widget.Toast; 


public class MainActivity extends Activity { 

private final IntentFilter mIntentFilter = new IntentFilter(); 
private WifiP2pManager mManager = null; 
private WifiP2pManager.Channel mChannel = null; 
private BroadcastReceiver mReciever; 
private ListView mListView; 
public static final String TAG = "wifidirectdemo"; 

// TXT RECORD properties 
public static final String TXTRECORD_PROP_AVAILABLE = "available"; 
public static final String SERVICE_INSTANCE = "_wifidemotest"; 
public static final String SERVICE_REG_TYPE = "_presence._tcp"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mListView = (ListView) findViewById(R.id.listView); 

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

    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
    mChannel = mManager.initialize(this, getMainLooper(), null); 
    mReciever = new WiFiBroadCastReciever(mManager, mChannel, this); 
    startRegistration(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    mReciever = new WiFiBroadCastReciever(mManager, mChannel, this); 
    registerReceiver(mReciever, mIntentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mReciever); 
} 

public void OnDiscoverButtonClicked(View view) { 
    mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 
     @Override 
     public void onSuccess() { 
      Toast.makeText(MainActivity.this, "Discovery Process Succeded", Toast.LENGTH_SHORT).show(); 
      System.out.println("changed"); 
     } 

     @Override 
     public void onFailure(int reason) { 
      Toast.makeText(MainActivity.this, "Discovery Process Failed", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

private static List peers = new ArrayList();/* 
private ArrayAdapter listAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,peers);*/ 

static WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() { 
    @Override 
    public void onPeersAvailable(WifiP2pDeviceList peerList) { 
     peers.clear(); 
     peers.addAll(peerList.getDeviceList()); 
    } 
}; 

private void startRegistration() { 
    // Create a string map containing information about your service. 
    Map record = new HashMap(); 
    record.put(TXTRECORD_PROP_AVAILABLE, "visible"); 

    // Service information. Pass it an instance name, service type 
    // _protocol._transportlayer , and the map containing 
    // information other devices will want once they connect to this one. 
    WifiP2pDnsSdServiceInfo serviceInfo = 
      WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record); 

    // Add the local service, sending the service info, network channel, 
    // and listener that will be used to indicate success or failure of 
    // the request. 
    mManager.addLocalService(mChannel, serviceInfo, new WifiP2pManager.ActionListener() { 
     @Override 
     public void onSuccess() { 
      Toast.makeText(MainActivity.this, "Added Local Service", Toast.LENGTH_SHORT); 
     } 

     @Override 
     public void onFailure(int arg0) { 
      Toast.makeText(MainActivity.this,"Failed to add a service",Toast.LENGTH_SHORT); 
     } 
    }); 
} 

}

我Broadcastreciever类是这样的:

package com.example.hellowifi; 

import java.util.HashMap; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.NetworkInfo; 
import android.net.wifi.p2p.WifiP2pManager; 
import android.net.wifi.p2p.WifiP2pManager.PeerListListener; 
import android.util.Log; 
import android.widget.Toast; 

public class WiFiBroadCastReciever extends BroadcastReceiver { 

private MainActivity activity; 
private WifiP2pManager mManager=null; 
private WifiP2pManager.Channel mChannel=null; 
PeerListListener myPeerListListener = null; 

public WiFiBroadCastReciever(WifiP2pManager manager, WifiP2pManager.Channel channel, 
            Activity activity) { 
    super(); 
    this.mManager = manager; 
    this.mChannel = channel; 
    this.activity = (MainActivity) 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 (WifiP2pManager.WIFI_P2P_STATE_ENABLED==state) 
      Log.d("WiFiBroadCastReciever", "WiFi enabled"); 
     else 
      Log.d("WiFiBroadCastReciever", "WiFi disabled"); 
    } 
    else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){ 
     Toast.makeText(activity, "in intent", Toast.LENGTH_LONG).show(); 
     if (mManager != null) { 
      mManager.requestPeers(mChannel, myPeerListListener);     
     } 
    } 
    else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)){ 
     if (mManager == null) { 
      return; 
     } 

     NetworkInfo networkInfo = (NetworkInfo) intent 
       .getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); 

     if (networkInfo.isConnected()) { 
      // We are connected with the other device, request connection 
      // info to find group owner IP 
      /*mManager.requestConnectionInfo(mChannel, connectionListener);*/ 
     } 

    } 
    else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)){ 

    } 
} 

final HashMap<String, String> buddies = new HashMap<String, String>(); 

}

我正在成功调用广播意图WIFI_P2P_STATE_CHANGED_ACTION,WIFI_P2P_CONNECTION_CHANGED_ACTION,WIFI_P2P_THIS_DEVICE_CHANGED_ACTION,但不是WIFI_P2P_PEERS_CHANGED_ACTION 当我将共享和便携式热点连接到其他设备并尝试在我的设备上发现时。

需要注意的是:无线网络启用了,我也越来越发现的吐司成功。在此之后WIFI_P2P_PEERS_CHANGED_ACTION意图没有调用。 我试过在每一个线程上搜索。 请尽量帮助我一个人。提前致谢。

回答

0

你需要运行discoverPeers()在其他设备上也是如此。 现在,您将收到WIFI_P2P_PEERS_CHANGED_ACTION意图

+0

我做相同的,但仍然'WIFI_P2P_PEERS_CHANGED_ACTION'没有播出.. @Jithu –

0

我以前有同样的问题。请检查下面的情况我是如何解决问题的。

首先,我已经实现了在服务器和客户端的Android设备相同的代码有细微的变化。我在服务器应用程序中放置了一个按钮来调用discoverPeers()方法。与此同时,我的客户端应用程序正在运行并连接到相同的WI-FI网络。然后它在服务器应用程序中通过广播触发WIFI_P2P_PEERS_CHANGED_ACTION事件。在那里,我得到了附近同行的名单。