2014-05-09 39 views
0

我有两个设备:HTC One X的(安卓4.2.2)和三星N8000注(安卓4.1.2)的Android无线上网的P2P连接

我需要使用Wi-Fi点对点连接它们。

我以Creating P2P Connections with Wi-Fi为例,创建了广播接收器和Wifi P2P初始化。

private class WifiP2PBroadcastReceiver extends BroadcastReceiver { 

    public WifiP2PBroadcastReceiver() { 
     register(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     String action = intent.getAction(); 

     if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) { 
      int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); 

      logger.fine("WifiP2PBroadcastReceiver: WIFI_P2P_CONNECTION_CHANGED_ACTION " + ((state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) ? "enabled" : "disabled")); 
     } 
     else if (action.equals(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)) { 
      peersUpdated(); 
     } 
    } 

    public void register() { 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
     intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 

     context.registerReceiver(this, intentFilter); 
    } 

    public void unregister() { 
     context.unregisterReceiver(this); 
    } 
} 

无线上网的P2P初始化:

private void initWifiP2p() { 
// initialization 
wifiP2pManager = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE); 

channel = wifiP2pManager.initialize(context, context.getMainLooper(), new WifiP2pManager.ChannelListener() { 
     @Override 
     public void onChannelDisconnected() { 
      logger.fine("onChannelDisconnected"); 
     } 
    }); 

// peer disccovery 
wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() { 

     @Override 
     public void onSuccess() { 
      peersUpdated(); 
     } 

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

// method called when discoverPeers listener's onSuccess is called 
private void peersUpdated() { 
    logger.fine("peersUpdated"); 

    wifiP2pManager.requestPeers(channel, new WifiP2pManager.PeerListListener() { 
     @Override 
     public void onPeersAvailable(WifiP2pDeviceList peers) { 
      // print all peers 
      for (WifiP2pDevice device : peers.getDeviceList()) { 
       logger.fine("peersUpdated: " + device.deviceName + " " + device.primaryDeviceType + " " + device.deviceAddress); 
      } 
     } 
    }); 
} 

在这两个设备:如果WiFi AP间断开 - 什么也没有发生,无Wi-Fi连接被启动。广播接收器处于接收状态,不会调用WIFI_P2P_CONNECTION_CHANGED_ACTION。 我需要做什么来建立Wifi P2P连接?

如果设备连接到Wifi AP,则调用WIFI_P2P_PEERS_CHANGED_ACTION,但找不到对等方。

回答

0

你有没有添加了以下权限在清单文件

<uses-permission 
     android:required="true" 
     android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission 
     android:required="true" 
     android:name="android.permission.CHANGE_WIFI_STATE"/> 
<uses-permission 
     android:required="true" 
     android:name="android.permission.INTERNET"/> 
+0

这些权限在AndroidManifest.xml中设置。 –

4

我发现,我的两个设备的两个的Nexus 4的运行奇巧,调用discoverPeers需要。 首先“发现”彼此。

然后我还得在的onReceive在BroadCastReceive类,钩到这条消息:

WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) 

然后调用

if (mManager != null) { 
    mManager.requestPeers(mChannel,mMyWiFiActivity); 
} 

这一操作将触发onPeerAvailable,其中曾经类,你有设置您的PeerListListener英寸

一旦您的设备“知道”彼此,然后(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action))事件似乎发生。 我在那里为requestPeers提供了一个调用。

我只是处于我的发展的初期阶段,打电话要求同伴是两个地方似乎不对,但目前我正在与它一起。好运

+0

谢谢!我还面临着WIFI_P2P_PEERS_CHANGED_ACTION意图永远不会触发的问题。我错过了接收设备的discoverPeers调用。有一次,我在发送和接收设备(初始化后)之后调用discoverPeers,它触发了WIFI_P2P_PEERS_CHANGED_ACTION操作。 –