【问题标题】:wifi p2p peers changed intent not triggeredwifi p2p 对等点更改意图未触发
【发布时间】:2018-01-16 10:05:36
【问题描述】:

我正在开发一个 wifi p2p 文件共享应用程序。但我无法发现同行

下面是我的活动代码

    package com.neeraj8le.majorproject.activity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.neeraj8le.majorproject.R;
import com.neeraj8le.majorproject.WiFiDirectBroadcastReceiver;

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

public class SelectPeerActivity extends AppCompatActivity{

    WifiP2pManager mManager;
    WifiP2pManager.Channel mChannel;
    BroadcastReceiver mReceiver;
    IntentFilter mIntentFilter;
    ArrayAdapter<String> wifiP2pArrayAdapter;
    ListView listView;


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

        listView = findViewById(R.id.list_view);

        wifiP2pArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        listView.setAdapter(wifiP2pArrayAdapter);

        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);
        mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);



        search();


    }

    public void search()
    {
        mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(SelectPeerActivity.this, "SUCCESS", Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onFailure(int reasonCode) {
                Toast.makeText(SelectPeerActivity.this, "FAILURE", Toast.LENGTH_SHORT).show();
            }
        });

    }

    public void displayPeers(WifiP2pDeviceList peerList)
    {
        wifiP2pArrayAdapter.clear();

        for(WifiP2pDevice peer : peerList.getDeviceList())
            wifiP2pArrayAdapter.add(peer.deviceName + "\n" + peer.deviceAddress);

    }


    /* 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);
    }

}

这是我的广播接收器的代码

package com.neeraj8le.majorproject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
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;

import com.neeraj8le.majorproject.activity.SelectPeerActivity;

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


public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = ":::::::::::::::::::::";
    private WifiP2pManager mManager;
    private WifiP2pManager.Channel mChannel;
    private SelectPeerActivity mActivity;
    List<WifiP2pDevice> mPeers;
    List<WifiP2pConfig> mConfigs;

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

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = 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) {
                Toast.makeText(mActivity, "Wifi Direct Enabled", Toast.LENGTH_SHORT).show();
                // Wifi P2P is enabled
            } else {
                Toast.makeText(mActivity, "Wifi Direct Disabled", Toast.LENGTH_SHORT).show();
                // Wi-Fi P2P is not enabled
            }

        }
        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()
            mPeers = new ArrayList<>();
            mConfigs = new ArrayList<>();

            if (mManager != null) {

                mManager.requestPeers(mChannel, new WifiP2pManager.PeerListListener() {
                            @Override
                            public void onPeersAvailable(WifiP2pDeviceList peerList) {
                                mPeers.clear();
                                mPeers.addAll(peerList.getDeviceList());
                                mActivity.displayPeers(peerList);

                                for (int i = 0; i < peerList.getDeviceList().size(); i++) {
                                    WifiP2pConfig config = new WifiP2pConfig();
                                    config.deviceAddress = mPeers.get(i).deviceAddress;
                                    mConfigs.add(config);
                                }
                            }

                        });

            }

            if (mPeers.size() == 0) {
                Log.d("::::::::::::::::::::::", "No devices found");
                return;
            }

        }
        else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            Log.d(TAG, "wifi p2p connection changed action");
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            Log.d(TAG,"network info available");
            // Respond to new connection or disconnections
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            // Respond to this device's wifi state
            Log.d(TAG, "wifi p2p this device changed action");
//            notifyDeviceUpdate();
            WifiP2pDevice thisDevice = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
            Log.d(TAG,"this device acquired");
        }
    }
}

我从here获得了大部分代码

我调试了应用程序,所有 3 个意图过滤器都被触发,除了

WIFI_P2P_PEERS_CHANGED_ACTION

我尝试将另一台 android 设备放在我的手机附近,看看它是否检测到对等点,并且有一次 id 确实触发了 WIFI_P2P_PEERS_CHANGED_ACTION 意图。但后来它说对等点列表大小为 0,因此我无法找到对等点。

非常感谢您对此问题的任何帮助。

【问题讨论】:

  • 任何解决方案??还是??

标签: android android-intent wifi-direct android-broadcastreceiver wifip2p


【解决方案1】:

我想问题在于您尝试发现的设备不是“可发现的”。与 WiFi P2P 中的蓝牙发现类似,它也必须启用,不幸的是它不像在 BT 中那样明确发生。根据我的经验,为了能够发现其他设备,您必须:

  1. 导航至 WiFi -> 设置 -> Wi-Fi Direct(在 Android 6.0 上,可能因版本而异)。只需停留在菜单中即可。
  2. 也在其他设备上开始发现过程。

这有点棘手,但我找不到任何其他解决方案。 Android WifiP2p 的文档对此也只字未提。请参阅我的answer,我在那里做了更多解释。

【讨论】:

  • 它确实触发了一次同伴改变意图,那是我进入设置并启用 WiFi 直连的时候。但即使在那之后它说有0个对等点..另外我如何在不进入设置的情况下直接启用其他设备的WiFi?如何在我的应用中添加它?
  • 您必须按照here 的描述在ON_PEERS_CHANGED 中调用requestPeers。我之前没有注意到您只引用方法参数。您可以通过在其上启动发现来直接启用其他设备 WiFi。此外,扫描持续 30 秒,因此您可以考虑一下
  • 我在代码中的ON_PEERS_CHANGED 中调用了requestPeers。另外我的意思是,您如何也可以通过他们的应用程序直接启用其他设备的 wifi .. 是否通过在其他设备上调用 discoverPeers 来完成?
  • 好的。我将通过在另一台设备上安装我的应用程序并在两台设备上同时调用 discoverPeers 来尝试
  • 再次查看if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action))requestPeers 调用是在那里进行的,它没有被评论
【解决方案2】:

为了能够通过直接 Wi-Fi 检测其他设备,您必须激活每部手机上的位置信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多