[英]Android Wi-Fi Direct: onPeersAvailable
我正在開發一個基於WiFi Direct for Android的簡單應用程序,該應用程序必須連接兩個設備。 為此,我需要調用函數onPeersAvailable(myPeerListListener),但我不知道該怎么做。
我的應用程序具有以下兩個元素:
1-主要活動:
package android.nacho.WifiDirect;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class WifiDirect extends Activity {
WifiP2pManager mManager;
Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi_direct);
//To register the BroadastReceiver
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null); //It was necessary to make a cast (Channel)
mReceiver = new WiFiBroadcastReceiver(mManager, mChannel, this); //, this);
//Layout
final Button btnScan = (Button)findViewById(R.id.btnScan);
final TextView TextDebug=(TextView)findViewById(R.id.TextDebug);
//To define the filter in the BroadcastReceiver
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);
final OnClickListener ScanListener=new OnClickListener() //Sacado de TEstPsycologico
{
public void onClick(View v){
TextDebug.setText("Se intentan buscar Peers");
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
public void onSuccess() {
TextDebug.setText("Ha habido éxito buscando Peers");//DEBUG: Para ver si es posible encontrar Peers
}
public void onFailure(int reasonCode) {
TextDebug.setText("Algo ha salido mal buscando Peers"); //DEBUG: Para ver si pasó algo raro busando Peers
}
});
onPeersAvailable(myPeerListListener);
}
};
btnScan.setOnClickListener(ScanListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_wifi_direct, menu);
return true;
}
//
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, mIntentFilter);
}
// unregister the broadcast receiver
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
}
2類BroadcastReceiver:
package android.nacho.WifiDirect;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pManager;
import android.widget.Toast;
/**
* A BroadcastReceiver that notifies of important Wi-Fi p2p events.
*/
public class WiFiBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager manager;
private Channel channel;
private WifiDirect activity;
private PeerListListener myPeerListListener;
//For toast, add also context
//private Context context;
public WiFiBroadcastReceiver(WifiP2pManager manager, Channel channel, WifiDirect activity){//, Context context) {
super();
this.manager = manager;
this.channel = channel;
this.activity = activity;
// this.context= context;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
// Check to see if Wi-Fi is enabled and notify appropriate activity
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
//Toast.makeText(context, "Wi-Fi Direct is enable", Toast.LENGTH_LONG).show();
} else {
//Toast.makeText(context, "Wi-Fi Direct is not enable", Toast.LENGTH_LONG).show();
}
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
// Call WifiP2pManager.requestPeers() to get a list of current peers
// request available peers from the wifi p2p manager. This is an
// asynchronous call and the calling activity is notified with a
// callback on PeerListListener.onPeersAvailable()
if (manager != null) {
manager.requestPeers(channel, myPeerListListener);
manager.onPeersAvailable(myPeerListListener);
}
} 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
}
}
}
到目前為止,我的代碼應該能夠檢測正在運行該應用程序的設備周圍的對等對象,該ID應該存儲在變量myPeerListListener中 。 所有這些都發生在稱為OnReceiv()的BroadcastReceiver方法的第二個意圖中,方法是調用:
manager.requestPeers(channel, myPeerListListener);
現在,我想操作該列表。 因此,按照API信息應該調用requestPeers之后,您可以在此處看到該API:
http://developer.android.com/guide/topics/connectivity/wifip2p.html
*部分發現同行
所以我嘗試的是在下面的調用中寫:
manager.onPeersAvailable(myPeerListListener);
但是我得到這個錯誤:
對於類型WifiP2pManager,未定義onPeersAvailable(WifiP2pManager.PeerListListener)方法
誰能告訴我如何將PeerListListener正確發送到主活動?
非常感謝您的寶貴時間
dtheo已回答並指向有關此主題的出色的Android教程。 我將對OP的代碼進行更改,以顯示如何實現所需的功能。
根據此處的官方Android指南,應該以這種方式使用wifip2p發現api:
在您的MainActivity類中:
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
public void onSuccess() {
TextDebug.setText("Ha habido éxito buscando Peers");
}
public void onFailure(int reasonCode) {
TextDebug.setText("Algo ha salido mal buscando Peers");
}
});
// ############# DELETE THE FOLLOWING LINE #############
onPeersAvailable(myPeerListListener); // <<<<<<< DELETE THIS LINE
在您的BroadcastReceiver類中,執行以下操作:
@Override
public void onReceive(Context context, Intent intent) {
...
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
...
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
if (manager != null) {
manager.requestPeers(channel, new WifiP2pManager.PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peers) {
Log.d(TAG,String.format("PeerListListener: %d peers available, updating device list", peers.getDeviceList().size()));
// DO WHATEVER YOU WANT HERE
// YOU CAN GET ACCESS TO ALL THE DEVICES YOU FOUND FROM peers OBJECT
}
});
}
} 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
}
}
dtheo已經回答了這個問題。
我只想添加一個小注釋:對於Wi-Fi Direct,兩個設備都需要同時掃描才能互相發現。 還有一個掃描超時,這意味着一段時間后可能會丟失可發現性。
您應該在PeerListListener內部實現onPeersAvailable方法。
有關更多信息,請參閱http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.