2014-05-09 118 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操作。 –