Java 如何解决通过Wi-Fi(android API)发现其他设备的问题?
最近,我按照 但我在那里似乎有点运气。 我试图找到附近的同伴, 把它们放进arraylist,但似乎运气不好。我什么也没得到 我的两台设备实际上是安卓4.1和4.2 由于Wifi Direct基于API级别14,即android 4.0+so 我认为我真正的设备不是问题所在 我使用的概念是 使用1个活动和1个广播接收器 请看一下我的代码,是我放错了还是我忘了什么 Chat1Activity.javaJava 如何解决通过Wi-Fi(android API)发现其他设备的问题?,java,android,eclipse,wifi,broadcast,Java,Android,Eclipse,Wifi,Broadcast,最近,我按照 但我在那里似乎有点运气。 我试图找到附近的同伴, 把它们放进arraylist,但似乎运气不好。我什么也没得到 我的两台设备实际上是安卓4.1和4.2 由于Wifi Direct基于API级别14,即android 4.0+so 我认为我真正的设备不是问题所在 我使用的概念是 使用1个活动和1个广播接收器 请看一下我的代码,是我放错了还是我忘了什么 Chat1Activity.java package com.example.androtut; import java.util.
package com.example.androtut;
import java.util.ArrayList;
import others.MyBroadcastReceiver;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class Chat1Activity extends Activity {
private final IntentFilter mintentFilter = new IntentFilter();
private Channel mChannel;
private WifiP2pManager mManager;
private BroadcastReceiver mReceiver;
private ArrayList peers = new ArrayList();
private PeerListListener myPeerListListener = new PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
// Out with the old, in with the new.
peers.clear();
peers.addAll(peerList.getDeviceList());
// If an AdapterView is backed by this data, notify it
// of the change. For instance, if you have a ListView of available
// peers, trigger an update.
if (peers.size() == 0) {
Toast.makeText(getApplicationContext(),"Nothing found!", Toast.LENGTH_LONG).show();
return;
} else {
Toast.makeText(getApplicationContext(),"We've found " + peers.size() + " users", Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat1);
//Toast.makeText(getApplicationContext(), "Wifi is okay", Toast.LENGTH_LONG).show();
prepareIntentFilter();
Button btn_startchat = (Button) findViewById(R.id.btn_startchat);
// Listening to News Feed button click
btn_startchat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Launching News Feed Screen
detectPeers();
}
});
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
}
private void detectPeers(){
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// 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.
}
@Override
public void onFailure(int reasonCode) {
// Code for when the discovery initiation fails goes here.
// Alert the user that something went wrong.
}
});
}
@Override
protected void onResume() {
super.onResume();
mReceiver = new MyBroadcastReceiver(mManager, mChannel, this, myPeerListListener);
registerReceiver(mReceiver, mintentFilter);
}
/* unregister the broadcast receiver */
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
private void prepareIntentFilter() {
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
// Indicates a change in the list of available peers.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
// Indicates the state of Wi-Fi P2P connectivity has changed.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
// Indicates this device's details have changed.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
}
}
package others;
import java.util.ArrayList;
import com.example.androtut.Chat1Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager mManager;
private Channel mChannel;
private Chat1Activity mActivity;
private PeerListListener myPeerListListener;
public MyBroadcastReceiver(WifiP2pManager manager, Channel channel,
Chat1Activity activity, PeerListListener obPeerList) {
super();
this.mManager = manager;
this.mChannel = channel;
this.mActivity = activity;
this.myPeerListListener = obPeerList;
}
@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
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
// Call WifiP2pManager.requestPeers() to get a list of current peers
if (mManager != null) {
mManager.requestPeers(mChannel, 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
}
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
// Wifi P2P is enabled
Toast.makeText(mActivity.getApplicationContext(),"Wifi is okay", Toast.LENGTH_LONG).show();
} else {
// Wi-Fi P2P is not enabled
Toast.makeText(mActivity.getApplicationContext(),
"Wifi is not okay", Toast.LENGTH_LONG).show();
}
}
}
}
以及MyBroadcastReceiver.java
package com.example.androtut;
import java.util.ArrayList;
import others.MyBroadcastReceiver;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class Chat1Activity extends Activity {
private final IntentFilter mintentFilter = new IntentFilter();
private Channel mChannel;
private WifiP2pManager mManager;
private BroadcastReceiver mReceiver;
private ArrayList peers = new ArrayList();
private PeerListListener myPeerListListener = new PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
// Out with the old, in with the new.
peers.clear();
peers.addAll(peerList.getDeviceList());
// If an AdapterView is backed by this data, notify it
// of the change. For instance, if you have a ListView of available
// peers, trigger an update.
if (peers.size() == 0) {
Toast.makeText(getApplicationContext(),"Nothing found!", Toast.LENGTH_LONG).show();
return;
} else {
Toast.makeText(getApplicationContext(),"We've found " + peers.size() + " users", Toast.LENGTH_LONG).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat1);
//Toast.makeText(getApplicationContext(), "Wifi is okay", Toast.LENGTH_LONG).show();
prepareIntentFilter();
Button btn_startchat = (Button) findViewById(R.id.btn_startchat);
// Listening to News Feed button click
btn_startchat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Launching News Feed Screen
detectPeers();
}
});
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
}
private void detectPeers(){
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// 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.
}
@Override
public void onFailure(int reasonCode) {
// Code for when the discovery initiation fails goes here.
// Alert the user that something went wrong.
}
});
}
@Override
protected void onResume() {
super.onResume();
mReceiver = new MyBroadcastReceiver(mManager, mChannel, this, myPeerListListener);
registerReceiver(mReceiver, mintentFilter);
}
/* unregister the broadcast receiver */
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
private void prepareIntentFilter() {
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
// Indicates a change in the list of available peers.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
// Indicates the state of Wi-Fi P2P connectivity has changed.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
// Indicates this device's details have changed.
mintentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
}
}
package others;
import java.util.ArrayList;
import com.example.androtut.Chat1Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager mManager;
private Channel mChannel;
private Chat1Activity mActivity;
private PeerListListener myPeerListListener;
public MyBroadcastReceiver(WifiP2pManager manager, Channel channel,
Chat1Activity activity, PeerListListener obPeerList) {
super();
this.mManager = manager;
this.mChannel = channel;
this.mActivity = activity;
this.myPeerListListener = obPeerList;
}
@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
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
// Call WifiP2pManager.requestPeers() to get a list of current peers
if (mManager != null) {
mManager.requestPeers(mChannel, 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
}
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
// Wifi P2P is enabled
Toast.makeText(mActivity.getApplicationContext(),"Wifi is okay", Toast.LENGTH_LONG).show();
} else {
// Wi-Fi P2P is not enabled
Toast.makeText(mActivity.getApplicationContext(),
"Wifi is not okay", Toast.LENGTH_LONG).show();
}
}
}
}
您是否检查过您的设备是否支持Wifi Direct? rom>4.0并不意味着它有wifi直接硬件支持。 尝试使用PackageManager的API检查:
我猜您没有在活动中添加PeerListener。所以它不会回复 您可以尝试在活动中实现PeerListener
public class Chat1Activity extends Activity implements WifiP2pManager.PeerListListener
@Override
public void onPeersAvailable(WifiP2pDeviceList peers) {
//put your code here
}
并在活动中重写OnPeeravaailable方法
public class Chat1Activity extends Activity implements WifiP2pManager.PeerListListener
@Override
public void onPeersAvailable(WifiP2pDeviceList peers) {
//put your code here
}
并更改接收器中的方法
if (mManager != null) {
mManager.requestPeers(mChannel, mActivity);
}
希望这有帮助 在你的android文件夹中,他们提供了一个wifi direct演示,你可以导航到此文件夹..samples/android-14/wifidirectdemohanks接受建议@Hardik4560,但是你可以查看我上面的代码吗?请在回答@jobcrazy,。。。。。从MyBroadcastReceiver.java您可以看到其wifi direct功能是否在那里测试的状态。除此之外,还必须忘记一些事情。您的意思是,您的Wi-fi P2P状态已更改,但附近没有任何设备,或者您根本没有收到任何广播?其他设备未显示在列表中。请检查代码。。。。。。有什么我忘了的吗?太好了!虽然我找到了自己的答案,但谢谢你D