Android/Java WiFi 直接对等列表

2024-04-21

Yo,

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

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

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

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

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

我一整天都在与这个问题作斗争,还得花粉症,让生活变得更加甜蜜

CODE:

活动:

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 的了解非常少。

提前致谢。


我可以看到你在构建你的时候做了一个初步的发现WiFiDirect广播接收器

然后在你的Activity.onResume()你首先构建WiFiDirect广播接收器进而注册接收者().

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

您看不到响应返回的问题可能是由于顺序所致。尝试移动发现Peers() to Activity.onResume()应该可以解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android/Java WiFi 直接对等列表 的相关文章

随机推荐

  • 不要将通过 VBA 所做的更改添加到撤消历史记录中

    我有一组 Word 宏 用于格式化从外部源发送到的文档 通常会对文档进行很多更改 所有这些更改都记录在撤消历史记录中 这是我不希望的 有没有一种方法可以不将所有这些更改添加到撤消历史记录中 而只是添加一个撤消操作来撤消宏所做的所有操作 谢谢
  • WKWebView 缓存清单不适用于 IOS8

    缓存清单工作正常 并且在 IOS 8 的 safari 中触发事件 在 WKWebView 中根本不起作用 还有其他人解决这个问题吗 导入 UIKit 导入WebKit class ViewController UIViewControll
  • 用于移动物体的空间数据结构?

    我想知道处理大量移动对象 球体 三角形 盒子 点等 的最佳数据结构是什么 我试图回答两个问题 最近邻和碰撞检测 我确实意识到 传统上 像 R 树这样的数据结构用于最近邻查询 Oct Kd BSP 用于处理静态对象或很少移动对象的碰撞检测问题
  • Facebook 登录不会返回到带有 Xcode 7 iOS 9 的应用程序

    我已经使用 Xcode 7 在 App Delegate 中实现了 Facebook 登录的此方法 并且效果完美 BOOL application UIApplication app openURL NSURL url options NS
  • 计算日期范围内的星期天数

    我正在尝试使用 PHP 计算给定日期范围内的工作日数 周一 周五 如果用户输入开始日期 2010 12 01 和结束日期 2010 12 24 该函数应输出该日期范围内的工作日数 这是我发现的 但没有帮助 function getworki
  • 如何为 4.7.2 之前的 .Net Framework 设置 cookie 属性 Samesite = None(对于 4.5.2)

    根据 Google Chrome 的最新更新 它只允许具有属性的跨平台 cookie sameSite None Link https learn microsoft com en us aspnet samesite system web
  • 如何从基于回调的 API 创建 AngularJS Promise

    wifiservice js angular module app WifiServices factory WifiService function var unique array angular fromJson function w
  • 如何在 url Rails 中编码 (.) 点

    我有如下所示的路线来删除 列出用户 map connect developer user name delete controller gt developers action gt delete method gt delete map
  • 如何在 Xcode 中制作数学方程?

    I am a total beginner with Xcode and Objective C but I have some experience with OOP in C I bought this https rads stack
  • Python自定义映射类**解包和'keys'属性

    我想用一个SimpleNameSpace它也可以充当映射 以便能够与 拆包 这是我所做的 class MySimpleNameSpace object my initial attempt subclassed SimpleNameSpac
  • 使用 powershell 删除文件夹中的特定文件

    我想使用 powershell 脚本从我的文件夹 D Test 中删除特定的文本文件 以下是我的文件夹中的文件列表 需要删除文件名中名为 Defrag 的文件 Test txt Log txt Defrag 20180111 txt Def
  • JavaScript 将字符串字符作为数组访问

    这样做可以吗 var myString Hello alert myString 0 shows H in an alert window 或者应该使用 charAt 0 或 substr 0 1 来完成 我所说的 可以吗 我的意思是它可以
  • Cython - 将数组指针转换为 Python 对象

    好吧 我已经快完成这个了 我可以尝尝它的味道了 在过去的几周左右的时间里 我一直在尝试创建一个 Python 扩展 以通过 Cython 与用 C 编写的库进行交互 在这里的人和几个朋友的帮助下 我已经成功完成了 98 的任务 唯一剩下的就
  • Websockets:npm 中的 Rachet 和 autobahn 兼容吗?

    我正在尝试Ratchet PHP 库 http socketo me 特别是 我一直在尝试整合他们的推式整合 http socketo me docs push演示到 React 应用程序中 他们的演示参考看似一次性的 autobahn J
  • 如何在 Electron 应用程序中显示“另存为”对话框?

    我正在编写一个要在所有平台上分发的 NodeJS Electron 应用程序 我有一个下载按钮 我想弹出一个 另存为 对话框 其中包含从服务器提供的文件 有人知道最好的方法吗 以下是我在本地运行节点应用程序时尝试过的方法 但在使用电子打包器
  • 没有预测器的 Sklearn 回归

    是否可以在 sklearn 中使用或不使用 即仅使用截距 预测器来运行回归 例如逻辑回归 这似乎是一个相当标准的类型分析 也许这些信息已经在输出中可用 我发现的唯一相关的事情是sklearn svm l1 min c但这会返回一个非空模型
  • 在 PHP 5.5.9 中的 PHP 开关中使用常量

    安装 PHP 5 5 9 后Ubuntu 14 04 https en wikipedia org wiki Ubuntu version history Ubuntu 14 04 LTS 28Trusty Tahr 29 Trusty T
  • 在调试器下运行时,AssignProcessToJobObject 失败并出现“访问被拒绝”错误

    You do AssignProcessToJobObject并且仅当您在调试器中运行时才会因 访问被拒绝 而失败 为什么是这样 这个问题让我困惑了大约30分钟 首先 您可能需要在您的应用程序中嵌入一个 UAC 清单 正如这里所建议的 ht
  • 从 iPhone 中的视频帧获取图像

    是否可以使用 iPhone SDK 从 iPhone 中的视频中抓取帧并将其保存或在应用程序中以任何方式使用它 除了播放 停止或访问视频的二进制数据之外 SDK 是否可以对视频进行任何控制 还可以知道用户停止观看视频的时间 我知道在 SDK
  • Android/Java WiFi 直接对等列表

    Yo 我正在尝试让 Android 设备 它是 Nexus 7 尽管我无法想象这有多重要 通过 WiFi Direct 的奇迹与 Raspberry Pi 进行通信 据说这是可能的 六个小时前似乎是比沿着服务器 客户端路线更好的解决方案 但