【问题标题】:Android/Java WiFi direct peer listAndroid/Java WiFi 直接对等点列表
【发布时间】:2013-07-08 15:50:50
【问题描述】:

哟,

我正在尝试让一个 Android 设备(它是一个 Nexus 7,虽然我无法想象这很重要)通过 WiFi Direct 的奇迹与 Raspberry Pi 进行通信。据说这是可能的,而且六个小时前似乎比沿着服务器-客户端路由更好的解决方案,但我遇到了问题

Android 开发者网站很不错,它有两个指南:

http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html http://developer.android.com/guide/topics/connectivity/wifip2p.html

这很好,因为我没有大量的 Java 经验。但问题在于......实际上在那个网站上很多,他们认为直接的代码中的元素(即放置东西的位置)经常丢失。

我非常密切地遵循了这两个指南,但我遇到了一个问题 - WIFI_P2P_PEERS_CHANGED_ACTION 意图从不广播,所以当我在寻找同伴时,它会开始搜索,说一切都很好,但没有给出我的结果列表...我猜应该是的

我一天中的大部分时间都在为此苦苦挣扎,用一个很好的花粉热病例让生活变得更加甜蜜

代码:

活动:

package com.example.bingotest;

import java.util.ArrayList;
import java.util.List;

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.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.util.Log;
import android.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 android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.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
        }

    }

    //-------------------------------------------------------------------------------

}

(对可能出现混乱和浪费的代码表示歉意 - 我一直在尝试获得结果)

我们将非常感激您的帮助。我的猜测是 peerListListener 在错误的地方。我的 Android 知识很少。

提前致谢。

【问题讨论】:

  • 感谢您提出这个问题..
  • 您找到解决方案了吗?

标签: java android android-wifi


【解决方案1】:

我可以看到您在构建 WiFiDirectBroadcastReceiver

时做了初步发现

然后在您的 Activity.onResume() 中,您首先构造 WiFiDirectBroadcastReceiver,然后再构造 registerReceiver()

@Override
public void onResume() {
    super.onResume();
    _broadcastReceiver = new WiFiDirectBroadcastReceiver(_manager, _channel, this, _peerListListener);
    registerReceiver(_broadcastReceiver, _intentFilter);
}

您没有看到响应返回的问题可能是因为顺序。尝试将 discoverPeers() 移动到 Activity.onResume() 应该可以解决问题.

【讨论】:

    【解决方案2】:

    你错过了给DiscoverPeers的电话:

    要开始使用 Wi-Fi Direct 搜索附近的设备,请致电 发现Peers()。

    您希望何时发生初始发现的特定应用逻辑将决定您的代码中发生的位置。在 SDK 17 的 API 示例中,当从菜单中单击选项时会发生这种情况。这可以很容易地移动到 onResume 方法(这将在每次活动恢复时启动,或者在屏幕上按钮的单击侦听器中启动。

    对于将来的故障排除,我建议将 WiFiDirectBroadcastReceiver 类保留在 Activity 的类中(除非您需要重用代码)以便于回调使用 - 您可以直接从内部类访问外部类的方法并进行此操作更容易排除故障。

    【讨论】:

      【解决方案3】:

      尝试改变这个:

      _manager.requestPeers(_channel, _peerListListener);
      

      到这里:

      _manager.requestPeers(_channel, _activityRef._peerListListener);
      

      【讨论】:

        【解决方案4】:

        Google 自 2011 年 10 月起提供 Wifi Direct 示例:https://android.googlesource.com/platform/development/+/master/samples/WiFiDirectDemo

        我添加了这个链接,因为我花了一段时间才找到它(原始链接是指 Wifi P2P Demo,而不是 WiFiDirectDemo)。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多