2014-02-26 95 views
1

我想使用的Nexus 4Android的WiFi直連廣播接收器不會工作

連接到WiFi Direct網絡,我有以下代碼:

public class MainActivity extends ActionBarActivity { 

    WifiP2pManager mWifiP2pManager; 
    Channel mChannel; 
    WiFiDirectBroadcastReceiver mReceiver; 
    IntentFilter mIntentFilter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 



     mIntentFilter = new IntentFilter(); 
     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); 

     mWifiP2pManager = (WifiP2pManager)getSystemService(WIFI_P2P_SERVICE); 
     mChannel = mWifiP2pManager.initialize(this, getMainLooper(), null); 

     ((ImageButton)findViewById(R.id.imageButton_power)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("p2p", "discoverPeers() called"); 

       mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 

        @Override 
        public void onSuccess() { 
         Log.d("p2p", "discoverPeers() Success"); 
        } 

        @Override 
        public void onFailure(int reason) { 
         Log.d("p2p", "discoverPeers() Failure: " + reason); 
        } 
       }); 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mReceiver = new WiFiDirectBroadcastReceiver(mWifiP2pManager, mChannel, this); 
     registerReceiver(mReceiver, mIntentFilter); 

    } 

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

} 

而且廣播接收器:

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver { 

    private WifiP2pManager mManager; 
    private Channel mChannel; 
    private MainActivity mActivity; 

    public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel, MainActivity activity) { 
     super(); 
     this.mManager = manager; 
     this.mChannel = channel; 
     this.mActivity = activity; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     Log.d("p2p", "Action: " + action); 

     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
      // Check to see if Wi-Fi is enabled and notify appropriate activity 
     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      Log.d("p2p", "Requesting for peers"); 

      if (mManager != null) { 
       mManager.requestPeers(mChannel, peerListListener); 
      } 
     } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { 
      // Respond to new connection or disconnections 
     } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { 
      // Respond to this device's wifi state changing 
     } 
    } 

    private WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() { 
     @Override 
     public void onPeersAvailable(WifiP2pDeviceList peers) { 
      Log.d("p2p", "deviceCount = " + peers.getDeviceList().size()); 
     } 
    }; 
} 

當我點擊按鈕discoverPeers()返回成功。但是,我從來沒有得到任何在指定的IntentFilter的廣播,當我開始/恢復活動我得到一些廣播:

02-26 16:19:08.684 7656-7656/com.example.app D/p2p:操作: android.net.wifi.p2p.STATE_CHANGED 02-26 16:19:08.684
7656-7656/com.example.app D/p2p:操作: android.net.wifi.p2p。 CONNECTION_STATE_CHANGE 02-26 16:19:08.684
7656-7656/com.example.app d/P2P:操作: android.net.wifi.p2p.THIS_DEVICE_CHANGED

但他們都不是我註冊到IntentFilter的人,出於某種原因,我得到了這3個,雖然他們沒有添加到過濾器中。

編輯: 看來我糊塗了與琴絃的名字和他們的實際價值,我也收到了一些我加入的IntentFilter的行動。

+0

我想知道,您使用的是哪個Android版本? – user1850484

+0

我也在做同樣的事情,並且還面臨着只有幾次'WIFI_P2P_PEERS_CHANGED_ACTION'意圖被廣播並且有時不播放的問題。你有沒有得到解決方案? –

回答

1

然後,你實際上得到正確的結果,雖然他們不是你所期望的。當你p2p狀態改變時,你應該看到「android.net.wifi.p2p.CONNECTION_STATE_CHANGE」的值。其他過濾器也一樣。查看此頁面:http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html#WIFI_P2P_CONNECTION_CHANGED_ACTION

+0

是的,即時通訊使用Android Studio,所以我更改了gradle.build中的sdk版本 – UnTraDe

+0

您是對的,它確實顯示了我在那裏感到困惑的正確操作(請參閱我的編輯)。請編輯你的回答和你寫的評論,這樣人們就不會認爲問題出在了權限上。謝謝! – UnTraDe

+0

我也有類似的問題。但我無法理解這個解決方案。你能解釋一下嗎?我也可以從這條線獲得任何輸出。 Log.d(「p2p」,「deviceCount =」+ peers.getDeviceList()。size()); – user1850484

0

不確定您是否仍然關注此問題,但Google已在WifiP2p參考中添加了一條註釋,說明了此問題。 (即我有,以及一個問題)這裏找到:http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html

  // Code for when the discovery initiation is successful goes here. 
     // No services have actually been discovered yet, so this method 
     // can often be left blank. Code for peer discovery goes in the 
     // onReceive method, detailed below. 

從這注意看來,你將得到的onSuccess()指示如果discoverPeers()是成功的,但你只會收到「 WIFI_P2P_PEERS_CHANGED_ACTION'廣播,指示可用對等體列表已經改變,如果有可用對等體檢測到。我用兩個運行wifiP2p應用的智能手機測試了這一點。

我希望這個幫助,如果至少你可能會發現你在谷歌的參考答案。