gpt4 book ai didi

java - PC 和 Android 之间的 Wifi-Direct 消息

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:20 24 4
gpt4 key购买 nike

我正在尝试编写一个应用程序,允许我将消息从 Android 手机发送到 PC 上的控制台。我已经有了使用套接字将消息从一台 PC 发送到另一台 PC 的代码。现在我正在尝试按照本教程在 Android 手机上实现 Wifi-Direct:

https://developer.android.com/guide/topics/connectivity/wifip2p.html#creating-app

我有 2 个 java 文件:

MainActivity.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.p2p.WifiP2pManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity{
WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);

mIntentFilter = new IntentFilter();
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d("Peers Discovered", "SUCCEEDED");
}

@Override
public void onFailure(int reasonCode) {
Log.d("Peers Discovered", "FAILURE");
}
});
}

/* register the broadcast receiver with the intent values to be matched */
@Override
protected void onResume(){
super.onResume();
registerReceiver(mReceiver, mIntentFilter);
}

/* unregister the broadcast receiver */
@Override
protected void onPause(){
super.onPause();
unregisterReceiver(mReceiver);
}
}

WifiDirectBroadcastReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.util.Log;
import android.widget.Toast;

/**
 * A BroadcastReceiver that notifies of important Wi-Fi p2p events.
 */

class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private MainActivity mActivity;

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel, MainActivity activity) {
super();
this.mManager = manager;
this.mChannel = channel;
this.mActivity = activity;
}

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
WifiP2pManager.PeerListListener myPeerListListener = new WifiP2pManager.PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) {
for (WifiP2pDevice d: wifiP2pDeviceList.getDeviceList()){
Log.d("WIFIP2PDEVICE", "Device d's address: " + d.deviceAddress);
if (d.deviceAddress==""){
//obtain a peer from the WifiP2pDeviceList
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = d.deviceAddress;
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {

@Override
public void onSuccess() {
//success logic

}

@Override
public void onFailure(int reason) {
//failure logic
}
});
}
}
}
};

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) {
// Wifi P2P is enabled
Toast.makeText(context, "Wi-Fi Direct is enabled", Toast.LENGTH_SHORT).show();
} else {
// Wi-Fi P2P is not enabled
Toast.makeText(context,"Wifi is disabled, please enable to continue", Toast.LENGTH_SHORT);
}
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
// Call WifiP2pManager.requestPeers() to get a list of current peers

// request available peers from the wifi p2p manager. This is an
// asynchronous call and the calling activity is notified with a
// callback on PeerListListener.onPeersAvailable()
if (mManager != null) {
mManager.requestPeers(mChannel, myPeerListListener);
mManager.onPeersAvailable(myPeerListListener); //ERROR HAPPENS HERE

}

} 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
}
}
}

我当前遇到的问题是收到错误:

Cannot resolve method 'onPeersAvailable(android.net.wifi.p2p.WifiP2pManager.PeerListListener)

为什么我的代码无法识别 onPeersAvailable(...) 的实现?

最佳答案

您正在尝试直接调用onPeersAvailable(myPeerListListener)。这不是它的工作原理(如果您回顾一下您遵循的教程,您会发现他们也没有这样做)。您需要做的就是:

  • 使用 WifiP2pManager 注册监听器回调
  • 管理器将在准备就绪时调用您的监听器(异步)

删除有问题的行,一切都会好起来的。

关于java - PC 和 Android 之间的 Wifi-Direct 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44106323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com