Android / Java WiFi lista de pares directos

Yo,

Estoy tratando de obtener un dispositivo Android (es un Nexus 7, aunque no puedo imaginar que importa demasiado) para comunicarse con una frambuesa Pi a través de las maravillas de WiFi Direct. Se supone que es posible, y parecía hace seis horas como una solución mejor que ir por la ruta cliente-servidor, pero me encuentro con problemas

El sitio web de desarrolladores de Android es bueno en que tiene dos guías:

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

Lo cual es encantador, porque no tengo masas de experiencia en Java. Pero el problema con … bastante bien en ese sitio en realidad, es que los elementos en el código que consideran directo (es decir, dónde poner las cosas) a menudo se pierden.

He seguido bastante bien a las dos guías, pero he llegado a un problema: la intención de WIFI_P2P_PEERS_CHANGED_ACTION nunca se emite, así que cuando estoy buscando compañeros, comienza la búsqueda, dice que todo está bien, pero no me da una lista De los resultados … que supongo que debería

He estado luchando con esto durante la mayor parte del día con un buen caso de fiebre del heno para hacer la vida que un poco más dulce

CÓDIGO:

Actividad:

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 Clase:

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

(Disculpas por código potencialmente desordenado y derrochador – he estado experimentando tratando de obtener resultados)

La ayuda sería muy obligada. Mi conjetura es peerListListener está en el lugar equivocado. Mi conocimiento de Android es bastante mínimo.

Gracias por adelantado.

Puedo ver que hiciste un descubrimiento inicial al construirte WiFiDirectBroadcastReceiver

Y luego en su Activity.onResume () primero construye WiFiDirectBroadcastReceiver y luego registerReceiver () .

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

El problema que usted no ve que la respuesta vuelve es probablemente debido a la secuencia. El movimiento discoverPeers () a Activity.onResume () debe solucionar el problema.

Falta una llamada a DiscoverPeers :

Para iniciar la búsqueda de dispositivos cercanos con Wi-Fi Direct, llame a discoverPeers ().

La lógica específica de la aplicación para cuando desea que se produzca el descubrimiento inicial determinará en qué lugar de su código ocurrirá. En los ejemplos de API para SDK 17, esto sucede cuando se hace clic en un elemento de opción del menú. Esto se podría mover fácilmente al método onResume (esto se iniciará cada vez que se reanude la actividad o en el oyente de clics para un botón en la pantalla.

Para la futura solución de problemas, recomendaría mantener la clase WiFiDirectBroadcastReceiver dentro de la clase Activity (a menos que necesite reutilizar el código) para facilitar su uso con callbacks: puede acceder a los métodos de la clase externa directamente desde la clase interna y hacer esto un poco más fácil para solucionar problemas.

Intente cambiar esto:

 _manager.requestPeers(_channel, _peerListListener); 

a esto:

 _manager.requestPeers(_channel, _activityRef._peerListListener); 

Google proporciona un ejemplo de Wifi Direct desde octubre de 2011: https://android.googlesource.com/platform/development/+/master/samples/WiFiDirectDemo

  • ¿Cómo puedo crear dinámicamente una lista de todos los componentes de Android ui mediante programación? Por ejemplo, TextView, ImageView, etc
  • ¿Cómo hacer que el botón de cancelar trabaje en llamada sdk vinculada en la vista web android?
  • ¿Cuáles son las consecuencias de tener el ID de SENDER de GCM expuesto?
  • Uso de diferentes etiquetas de eje x para n líneas en un gráfico
  • Cómo comprobar la matriz de cadenas está vacío o Android nulo?
  • Java 7/8 en Android?
  • Sqlite en Android: Cómo crear una función sqlite dist db - que se utilizará en la aplicación para calcular la distancia utilizando lat, largo
  • ¿Cuál es la mejor manera de compartir datos entre actividades?
  • ¿Cómo hacer una devolución de llamada después de que la vista esté completamente renderizada?
  • ¿Qué debo hacer con el archivo pom.xml?
  • Android: Ripple de fondo mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.