Android/Java WiFi直接对等列表
哟
我正试图通过WiFi Direct的奇妙之处,让一台Android设备(它是Nexus 7,尽管我无法想象这有多重要)与一个覆盆子Pi进行通信。据推测这是可能的,六个小时前,这似乎是一个比走服务器-客户端路线更好的解决方案,但我遇到了一些问题
Android开发者网站很好,因为它有两个指南:
http://developer.安卓.com/training/connect-devices-wirelessly/wifi-direct.html http://developer.安卓.com/guide/topics/connectivity/wifip2p.html
这很可爱,因为我在Java方面没有丰富的经验。但问题是。。。事实上,在那个网站上,很多人认为代码中的元素(比如放东西的位置)经常会丢失
我已经非常仔细地遵循了这两个指南,但我遇到了一个问题——WIFI_P2P_PEERS_CHANGED_ACTION Intential从不广播,所以当我寻找同伴时,它会启动搜索,说一切都很好,但不会给我结果列表。。。我猜应该是这样
一天的大部分时间里,我都在努力解决这个问题,因为我得了一个很好的花粉热,让生活变得更加甜蜜
代码:
活动:
package com.example.bingotest;
import java.util.ArrayList;
import java.util.List;
import 安卓.net.wifi.p2p.WifiP2pDevice;
import 安卓.net.wifi.p2p.WifiP2pDeviceList;
import 安卓.net.wifi.p2p.WifiP2pManager;
import 安卓.net.wifi.p2p.WifiP2pManager.Channel;
import 安卓.net.wifi.p2p.WifiP2pManager.PeerListListener;
import 安卓.os.Build;
import 安卓.os.Bundle;
import 安卓.annotation.TargetApi;
import 安卓.app.Activity;
import 安卓.content.BroadcastReceiver;
import 安卓.content.Context;
import 安卓.content.Intent;
import 安卓.content.IntentFilter;
import 安卓.content.pm.ActivityInfo;
import 安卓.util.Log;
import 安卓.view.Menu;
public class BingoActivity extends Activity {
private BingoView _view;
private IntentFilter _intentFilter = new IntentFilter();
private BroadcastReceiver _broadcastReceiver = null;
private WifiP2pManager _manager;
private Channel _channel;
private List _peers = new ArrayList();
private PeerListListener _peerListListener;
//-------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
_view = new BingoView(this);
setContentView(_view);
_intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
_intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
_intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
_intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
_manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
_channel = _manager.initialize(this, getMainLooper(), null);
//_broadcastReceiver = new WiFiDirectBroadcastReceiver(_manager, _channel, this);
//registerReceiver(_broadcastReceiver, _intentFilter);
_peerListListener = new PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
Log.d("wifi", "here");
// Out with the old, in with the new.
_peers.clear();
_peers.addAll(peerList.getDeviceList());
if (_peers.size() == 0) {
Log.d("wifi", "No devices found");
return;
}
}
};
}
//-------------------------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.bingo, menu);
return true;
}
//-------------------------------------------------------------------------------
@Override
public void onResume() {
super.onResume();
_broadcastReceiver = new WiFiDirectBroadcastReceiver(_manager, _channel, this, _peerListListener);
registerReceiver(_broadcastReceiver, _intentFilter);
}
//-------------------------------------------------------------------------------
@Override
public void onPause() {
super.onPause();
unregisterReceiver(_broadcastReceiver);
}
}
WiFiDirectBroadcastReceiver类:
package com.example.bingotest;
import java.util.ArrayList;
import java.util.List;
import 安卓.content.BroadcastReceiver;
import 安卓.content.Context;
import 安卓.content.Intent;
import 安卓.net.wifi.p2p.WifiP2pManager;
import 安卓.net.wifi.p2p.WifiP2pManager.Channel;
import 安卓.net.wifi.p2p.WifiP2pManager.PeerListListener;
import 安卓.util.Log;
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager _manager;
private Channel _channel;
private BingoActivity _activityRef;
private List _peers = new ArrayList();
PeerListListener _peerListListener;
//-------------------------------------------------------------------------------
public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel, BingoActivity activity, PeerListListener peerListListener) {
super();
_manager = manager;
_channel = channel;
_activityRef = activity;
_peerListListener = peerListListener;
_manager.discoverPeers(_channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d("wifi", "onsuccess");
}
@Override
public void onFailure(int reasonCode) {
Log.d("wifi", "onfailure");
}
});
}
//-------------------------------------------------------------------------------
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("wifi", "receive: " + 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) {
Log.d("wifi", "WIFI DIRECT ON");
} else {
Log.d("wifi", "WIFI DIRECT OFF");
}
}
else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
Log.d("wifi", "Peers changed");
if (_manager != null) {
_manager.requestPeers(_channel, _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
}
}
//-------------------------------------------------------------------------------
}
(为潜在的混乱和浪费代码道歉——我一直在尝试获得结果)
非常感谢你的帮助。我猜PeerListener来错地方了。我对安卓系统的了解很少
提前谢谢
# 1 楼答案
尝试更改此选项:
为此:
# 2 楼答案
自2011年10月以来,谷歌提供了一个Wifi直连的例子:https://android.googlesource.com/platform/development/+/master/samples/WiFiDirectDemo
我添加了这个链接,因为我花了一段时间才找到它(原来的链接是指Wifi P2P演示,而不是WiFiDirectDemo)