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
- Cómo hacer HorizontalScrollView RIGHT a LEFT Scroll android
- La forma más rápida / mejor para cargar una imagen grande (con Glide)
- ¿Cómo puedo recortar un mapa de bits para ImageView?
- Implementar getMaxAmplitude para audioRecord
- Operadores RxJava
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.
- Ajuste el botón Visible en otro acticty con la configuración de Preferencias
- ¿Por qué mi android enviar método de intento de correo electrónico no es el trabajo
- ¿Por qué IntentReceiverLeaked?
- Android Frame by Frame Problema de animación en elementos en un CursorAdapter
- No se puede crear una carpeta en el almacenamiento externo en android
- Selección de Android en el menú ListView
- ¿Cómo puedo cambiar el comportamiento del modo de avión de Android para que no apague la radio celular?
- Carga de paquetes a / de archivos en Android
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
- Programación de mensajes de texto – expiración
- Cómo bloquear el micrófono para utilizar otra aplicación?