Android / Java WiFi直接同行列表 [英] Android/Java WiFi direct peer list

查看:153
本文介绍了Android / Java WiFi直接同行列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

哟,

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

I'm trying to get an Android device (it's a Nexus 7 although I can't imagine that matters too much) to communicate with a Raspberry Pi throught the wonders of WiFi Direct. Supposedly it's possible, and it seemed six hours ago like a better solution than going down the server-client route, but I'm running into issues

Android开发者网站是很好,因为它有两个指南:

The Android developer website is nice in that it has two guides:

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

这很可爱,因为我没有大量的Java经验。但实际上,在该网站上存在的问题很多,他们认为代码中的元素(即放置东西)经常缺失。

Which is lovely, because I don't have masses of experience in Java. But the problem with... well quite a lot on that site actually, is that elements in code they deem straightfoward (i.e. where to put things) are often missing.

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

I've followed both guides pretty closely but I've reached a problem - the WIFI_P2P_PEERS_CHANGED_ACTION intent is never broadcast, so when I'm looking for peers, it starts the search, says everything is fine, but doesn't give me a list of the results... which I'm guessing it should

我一直在和大家一起摔跤,因为一个很好的干草原来让生活变得美好额外更甜蜜

I've been wrestling with this for most of the day with a nice case of hayfever to make life that extra bit sweeter

代码:

活动:

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类:

WiFiDirectBroadcastReceiver Class:

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
        }

    }

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

}

(对潜在的混乱和浪费代码道歉 - 我一直在尝试尝试获得结果)

(apologies for potentially messy and wasteful code - I've been experimenting trying to get results)

帮助很大。我的猜测是peerListListener在错误的地方。我的Android知识很少。

Help would be much obliged. My guess is peerListListener is in the wrong place. My Android knowledge is pretty minimal.

提前致谢。

推荐答案

我可以看到你在构建 WiFiDirectBroadcastReceiver

然后在 Activity.onResume()首先构建 WiFiDirectBroadcastReceiver 然后 registerReceiver()

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

你没有看到回复的问题可能是因为sequence。尝试将 discoverPeers()移动到 Activity.onResume()应该解决问题。

The problem that you do not see the response come back is probably because of the sequence.Try move discoverPeers() to Activity.onResume() should solve the problem.

这篇关于Android / Java WiFi直接同行列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆