java设备发现,java – 如何解决通过Wi-Fi(android API)发现其他设备?

但似乎我在那里有一些运气.

我试图发现附近可用的同伴,

把他们放进arraylist但似乎没有运气.我没有得到任何东西.

我的实际2设备实际上是android 4.1和4.2

由于Wifi Direct基于API Level 14,因此它是android 4.0

我认为我的真实设备不是问题.

我使用的概念是

使用1个活动和1个BroadCast接收器.

请看看我的代码,我说错了还是我忘了?

Chat1Activity.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);

}

}

和MyBroadcastReceiver.java

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();

}

}

}

}

解决方法:

我猜你没有将PeerListListener添加到你的活动中.所以它不会回复.

您可以尝试在活动中实现PeerListListener

public class Chat1Activity extends Activity implements WifiP2pManager.PeerListListener

并覆盖活动中的onPeerAvailable方法

@Override

public void onPeersAvailable(WifiP2pDeviceList peers) {

//put your code here

}

并在您的Receiver中更改requestPeers方法

if (mManager != null) {

mManager.requestPeers(mChannel, mActivity);

}

希望这有帮助!!

标签:broadcast,android,java,eclipse,wifi

来源: https://codeday.me/bug/20190926/1820456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值