【问题标题】:how to solve discovering other device via Wi-Fi (android API)?如何解决通过 Wi-Fi(android API)发现其他设备的问题?
【发布时间】:2014-06-23 03:03:20
【问题描述】:

最近我按照Developer.Android.Com给出的步骤进行操作

不过我在那边似乎运气不错。 我试图发现附近可用的对等点, 将它们放入数组列表中,但似乎没有运气。我什么都没收到。

我的实际 2 设备实际上是 android 4.1 和 4.2 由于 Wifi Direct 基于 API 级别 14,即 android 4.0+,所以 我认为我的真实设备不是问题。

我使用的概念是 使用 1 个活动和 1 个广播接收器。

请看一下我的代码,是我写错了还是忘记了什么?

Chat1Activity.java

package com.example.androtut;

import java.util.ArrayList;

import others.MyBroadcastReceiver;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;

import android.content.IntentFilter;
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.Bundle;
import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class Chat1Activity extends Activity {

    private final IntentFilter mintentFilter = new IntentFilter();
    private Channel mChannel;
    private WifiP2pManager mManager;
    private BroadcastReceiver mReceiver;
    private ArrayList peers = new ArrayList();
    private PeerListListener myPeerListListener = new PeerListListener() {
        @Override
        public void onPeersAvailable(WifiP2pDeviceList peerList) {

            // Out with the old, in with the new.
            peers.clear();
            peers.addAll(peerList.getDeviceList());

            // If an AdapterView is backed by this data, notify it
            // of the change.  For instance, if you have a ListView of available
            // peers, trigger an update.

            if (peers.size() == 0) {
                Toast.makeText(getApplicationContext(),"Nothing found!", Toast.LENGTH_LONG).show();
                return;
            } else {
                Toast.makeText(getApplicationContext(),"We've found " + peers.size() + " users", Toast.LENGTH_LONG).show();
            }


        }
    };


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

        //Toast.makeText(getApplicationContext(), "Wifi is okay", Toast.LENGTH_LONG).show();    

        prepareIntentFilter();

        Button btn_startchat = (Button) findViewById(R.id.btn_startchat);

        // Listening to News Feed button click
        btn_startchat.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // Launching News Feed Screen
                detectPeers();
            }
        });

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


    private void detectPeers(){

        mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {
                // Code for when the discovery initiation is successful goes here.
                // No services have actually been discovered yet, so this method
                // can often be left blank.  Code for peer discovery goes in the
                // onReceive method, detailed below.
            }

            @Override
            public void onFailure(int reasonCode) {
                // Code for when the discovery initiation fails goes here.
                // Alert the user that something went wrong.
            }
    });




    }


    @Override
    protected void onResume() {
        super.onResume();
        mReceiver = new MyBroadcastReceiver(mManager, mChannel, this, myPeerListListener);
        registerReceiver(mReceiver, mintentFilter);
    }
    /* unregister the broadcast receiver */
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }

    private void prepareIntentFilter() {

        mintentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        // Indicates a change in the list of available peers.
        mintentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        // Indicates the state of Wi-Fi P2P connectivity has changed.
        mintentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        // Indicates this device's details have changed.
        mintentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    }


}

还有 MyBroadcastReceiver.java

package others;

import java.util.ArrayList;

import com.example.androtut.Chat1Activity;

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

public class MyBroadcastReceiver extends BroadcastReceiver {

    private WifiP2pManager mManager;
    private Channel mChannel;
    private Chat1Activity mActivity;
    private PeerListListener myPeerListListener;



    public MyBroadcastReceiver(WifiP2pManager manager, Channel channel,
            Chat1Activity activity, PeerListListener obPeerList) {
        super();
        this.mManager = manager;
        this.mChannel = channel;
        this.mActivity = activity;
        this.myPeerListListener = obPeerList;
    }

    @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
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            // Call WifiP2pManager.requestPeers() to get a list of current peers

            if (mManager != null) {
                mManager.requestPeers(mChannel, myPeerListListener);
            }



        } 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



        }

        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) {
                // Wifi P2P is enabled
                Toast.makeText(mActivity.getApplicationContext(),"Wifi is okay", Toast.LENGTH_LONG).show();

            } else {
                // Wi-Fi P2P is not enabled
                Toast.makeText(mActivity.getApplicationContext(),
                        "Wifi is not okay", Toast.LENGTH_LONG).show();
            }
        }

    }

}

【问题讨论】:

  • 在你的android文件夹中,他们给出了一个wifi direct demo,你可以导航到这个文件夹..samples/android-14/WiFiDirectDemo
  • 感谢@Hardik4560 的建议,但你能看看我上面的代码吗?

标签: java android eclipse wifi broadcast


【解决方案1】:

我猜你没有将 PeerListListener 添加到你的活动中。所以它不会回复。

您可以尝试在您的活动中实现 PeerListListener

public class Chat1Activity extends Activity implements WifiP2pManager.PeerListListener

并在您的活动中覆盖 onPeerAvailable 方法

 @Override
  public void onPeersAvailable(WifiP2pDeviceList peers) {

   //put your code here

  }

并在您的 Receiver 中更改 requestPeers 方法

 if (mManager != null) {
            mManager.requestPeers(mChannel, mActivity);
 }

希望对您有所帮助!

【讨论】:

  • 太棒了!尽管我找到了自己的答案而不是这个,但是谢谢! :D
【解决方案2】:

您是否检查过您的设备是否支持 Wifi Direct? 拥有 rom > 4.0 并不意味着它具有 wifi 直接硬件支持。 尝试使用 PackageManager 的 API 检查: http://developer.android.com/reference/android/content/pm/PackageManager.html#hasSystemFeature(java.lang.String)

【讨论】:

  • 请在给出答案之前查看问题代码@jobcrazy,.....来自 MyBroadcastReceiver.java 的 bcoz 您可以查看其 wifi direct 功能是否已在那里测试的状态。除此之外,还必须忘记其他事情。
  • 你的意思是你有 Wi-fi P2P 状态改变的广播,但附近没有任何设备,或者你根本没有收到任何广播?
  • 其他设备未显示在列表中。请检查代码......有什么我忘记了吗?
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2017-01-16
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多