当前位置: 首页 > 面试题库 >

如何解决通过Wi-Fi(Android API)发现其他设备的问题?

陶高扬
2023-03-14
问题内容

最近,我按照Developer.Android.Com给出的步骤进行操作

但似乎我在那边有些运气。我试图发现附近的可用对等方,将它们放入arraylist,但似乎没有运气。我什么都没得到。

我的实际2个设备实际上是android 4.1和4.2,因为Wifi Direct基于API级别14(即Android
4.0+),所以我认为我的真实设备不是问题。

我使用的概念是使用1个活动和1个BroadCast Receiver。

请看一下我的代码,是我写错了还是忘记了什么?

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);
        html" target="_blank">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);
 }

希望这个帮助!



 类似资料:
  • 问题内容: 我正在研究通过多个Android设备之间的Wi-Fi Direct连接进行广播的可能性。我创建了一个简单的消息广播应用程序来测试它是否有效,但是到目前为止,我还无法广播消息。当我尝试发送数据包时,出现 SocketException (网络无法访问): 这是我的代码的本质: 有谁知道在 Android 设备上通过Wi-Fi Direct广播是否真的有效?如果它可以正常工作,我在做什么错

  • 可进行Wi-Fi连接的各种相关设定。 Wi-Fi 轻触方格,即可停用Wi-Fi功能。 接入点 会显示已保存或搜索到的接入点。曾经连接过1次的接入点,下次起会自动连接。 若轻触已保存的接入点,可进行连接测试或详细设定。 A ) 正在搜索接入点 B ) 加密 此接入点设定了加密。若要连接,需输入接入点设定的WEP密钥/WPA密钥。 C ) 接入点的信号强度 以无信号及3个等级的强度显示。 若已保存多个

  • 问题内容: 有什么方法可以向连接到特定Wi-Fi网络的设备发送通知? 说,我有一个名为“我的Wi-Fi”的Wi-Fi网络,该网络不安全,任何人都可以连接。公共网络。 可能有N个用户连接到“我的Wi-Fi”。这些用户可以执行任何类型的交易,例如在线支付。 现在,如果我想关闭或关闭“我的Wi-Fi”路由器或接入点,这些交易可能会失败。 因此,在关闭之前,我想向连接到“我的Wi-Fi”网络的所有用户发送

  • 有没有办法向连接到特定Wi-Fi网络的设备发送通知? 比方说,我有一个名为“我的Wi-Fi”的Wi-Fi网络,它是不安全的,即任何人都可以连接。公共网络。 可能有N个用户连接到“我的Wi-Fi”。这些用户可以执行任何类型的交易,例如在线支付。 现在,如果我想关闭或关闭“我的Wi-Fi”路由器或接入点,这些交易可能会失败。 所以在关闭之前,我想向所有连接到“我的Wi-Fi”网络的用户发送一条文本通知

  • 1. 开始连接无线网络()密码() 连接到指定无线网络。 示例: 光环板启动后,开始连接到无线网络“Maker-guest”。 2. 网络已连接? 如果网络已连接,报告条件成立。 示例: 光环板启动后,开始连接到无线网络“Maker-guest”。等网络连接成功后,所有LED灯亮起绿色。 3. 识别()语音()秒钟 识别指定语言(汉语或英语)语音指定时间。 示例: 光环板启动后,识别汉语语音3秒钟

  • Wi-Fi模块能够在平板电脑、手机和模块间建立无线Wi-Fi连接,可结合云服务实现IoT功能。 净重量:25.7g 体积:48×48×14mm 参数 无线标准:IEEE 802.11b/g/n(HT20) 频带范围:2412~2462MHz 工作模式:STA/AP/STA+AP 通信柜离:10m(空旷环境下) 工作电压:DC 5V 工作电流:200mA FCC ID:2AH9Q-NU001WF 抗