8

よ、

WiFi Directの驚異を介してRaspberry Piと通信するAndroidデバイス(Nexus 7ですが、それはあまり重要ではないと思います)を取得しようとしています。おそらくそれは可能であり、6時間前にはサーバーとクライアントのルートをたどるよりも良い解決策のように見えましたが、問題が発生しています

Android 開発者の Web サイトには、次の 2 つのガイドがあるという点で優れています。

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

私はJavaの経験があまりないので、これは素晴らしいことです。しかし、問題は...そのサイトで実際にかなり多くの場合、コード内の要素 (つまり、物を配置する場所) がしばしば欠落していると見なされることです。

私は両方のガイドをかなり厳密にフォローしましたが、問題に遭遇しました.WIFI_P2P_PEERS_CHANGED_ACTIONインテントは決してブロードキャストされないため、ピアを探しているときに検索を開始し、すべてがうまくいっていると言いますが、リストは表示されません.結果の...私はそれがすべきだと推測しています

私は一日のほとんどの間、花粉症の素敵なケースでこれと格闘しており、人生をさらに少し甘くしています

コード:

アクティビティ:

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 の知識はごくわずかです。

前もって感謝します。

4

4 に答える 4

3

WiFiDirectBroadcastReceiverを構築するときに最初の発見をしたことがわかります

次に、Activity.onResume()で、最初にWiFiDirectBroadcastReceiverを構築し、次にregisterReceiver()を構築します。

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

応答が返ってこない問題は、おそらくシーケンスが原因です。discoverPeers ()Activity.onResume( ) に移動してみてください。問題は解決するはずです。

于 2014-03-22T11:18:47.843 に答える
0

これを変更してみてください:

_manager.requestPeers(_channel, _peerListListener);

これに:

_manager.requestPeers(_channel, _activityRef._peerListListener);
于 2014-04-19T19:18:06.820 に答える
0

Google は 2011 年 10 月以降、Wifi Direct の例を提供しています: https://android.googlesource.com/platform/development/+/master/samples/WiFiDirectDemo

見つけるのに時間がかかったので、このリンクを追加しました (元のリンクは WiFiDirectDemo ではなく、Wifi P2P Demo を参照しています)。

于 2015-08-18T19:03:26.117 に答える
0

DiscoverPeersへの呼び出しがありません:

Wi-Fi Direct で近くのデバイスの検索を開始するには、discoverPeers() を呼び出します。

最初の検出をいつ行うかについての特定のアプリ ロジックによって、コード内のどこで発生するかが決まります。SDK 17 の API サンプルでは、​​これはメニューからオプション項目をクリックしたときに発生します。これは onResume メソッドに簡単に移動できます (これは、アクティビティが再開されるたびに開始されるか、画面上のボタンのクリック リスナーで開始されます。

今後のトラブルシューティングのために、コールバックを簡単に使用できるように (コードを再利用する必要がない限り) WiFiDirectBroadcastReceiver クラスをアクティビティのクラス内に保持することをお勧めします。内部クラスから外部クラスのメソッドに直接アクセスして、これを少し簡単にすることができます。トラブルシューティングします。

于 2013-08-26T14:19:39.477 に答える