安卓Wifi Direct能检测到设备,但同行列表为空

9

一切正常,但当WifiP2pManager调用onPeersAvailable方法时(它正确地调用该方法),对等设备列表为空,这是没有意义的,因为如果调用该方法,则表示发现了一个对等设备。 :S

我的代码有什么问题吗?谢谢。

主要活动、广播接收器和发现:

public class Main extends Activity{

FileManager flManager;
Context ctx;
LinearLayout lay_found_users;
LinearLayout lay_conversations;
AddLayoutItem addLayoutItem = new AddLayoutItem();
private final String TAG = "Main";

//Wifi Direct
WifiP2pManager mManager;
WifiP2pManager.Channel mChannel;
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;

WifiP2pManager.PeerListListener mPeerListListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_main);
    ctx = getApplicationContext();
    flManager = new FileManager(ctx);

    //Wifi Direct
    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 = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    mChannel = mManager.initialize(this, getMainLooper(), null);

    mPeerListListener = new WifiP2pManager.PeerListListener(){
        @Override
        public void onPeersAvailable(WifiP2pDeviceList peerList){
            Log.i(TAG, "Peers available");
            int size = peerList.getDeviceList().size();
            Log.i(TAG, String.valueOf(size));

        }
    };

    mReceiver = new WDBroadcastReceiver(mManager, mChannel, this, mPeerListListener);
    WDDiscovery wdDiscovery = new WDDiscovery(mManager, mChannel);
    wdDiscovery.discover();
}

@Override
protected void onResume(){
    super.onResume();
    registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onDestroy(){
    super.onDestroy();
    unregisterReceiver(mReceiver);
}

public class WDBroadcastReceiver extends BroadcastReceiver {

private WifiP2pManager mManager;
private WifiP2pManager.Channel mChannel;
private Main mActivity;
private final String TAG = this.getClass().getSimpleName();
private WifiP2pManager.PeerListListener mPeerListListener;

public WDBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel, Main activity, WifiP2pManager.PeerListListener peerListListener){
    super();
    this.mManager = manager;
    this.mChannel = channel;
    this.mActivity = activity;
    this.mPeerListListener = peerListListener;
}

@Override
public void onReceive(Context context, Intent intent){
    String action = intent.getAction();

    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){
            Log.i(TAG, "Wifi P2P Enabled");
        } else {
            Log.i(TAG, "Wifi P2P Disabled");
        }

    }else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){
        if (mManager != null){
            mManager.requestPeers(mChannel, mPeerListListener);
            Log.i(TAG, "Peer Discovered");
        }
    }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
    }
}
}

public class WDDiscovery {

    WifiP2pManager mManager;
    WifiP2pManager.Channel mChannel;
    private final String TAG = this.getClass().getSimpleName();

    public WDDiscovery(WifiP2pManager manager, WifiP2pManager.Channel channel) {
        mManager = manager;
        mChannel = channel;
    }

    public void discover() {

        mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Log.i(TAG, "WiFi P2P Discovery successful");
            }

            @Override
            public void onFailure(int reasonCode) {
                Log.i(TAG, "WiFi P2P Discovery error");
            }
        });
    }
}

enter image description here


你在使用什么作为你的“ListView”/“Adapter”?我这里看不到任何关于“ListView”的代码。 - Timothy Frisch
我还没有使用适配器。WifiP2pManager调用public void onPeersAvailable(WifiP2pDeviceList peerList){但peerList为空。 - ProtectedVoid
尝试在回调函数的调用处添加断点。查看在调用之前、期间和之后 peerList 的值是什么。 - Timothy Frisch
这里有一些有用的信息,我认为可能对你有帮助:https://dev59.com/4WnWa4cB1Zd3GeqPyDMc - Timothy Frisch
我已经尝试了,但是“解决方案”正是我正在做的事情,但是节点列表始终为空,尽管BroadcastListener检测到了节点。 - ProtectedVoid
让我们在聊天中继续这个讨论 - ProtectedVoid
2个回答

1
在我的情况下,我在清单文件中添加了以下内容并给了应用程序权限。 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 它有效。

0
我曾遇到同样的问题,我的解决方法是
将这两行代码添加到Android清单中。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

并确保请求位置的运行时权限


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接