I am trying to connect 2 devices with direct Wi-Fi, say device A and device B with android> 4.1. If I am on device A and I press the button to search for other devices, it does not always work the same.
For example, if I press the search button on device A, it does not find anything until I press the search button on device B, even if the application works on both. Thus, device B is not displayed until it starts searching for other devices. .
In other cases, if I search for devices with device A, it finds device B, even if the application was recently closed on device B, and if I try to connect to device B, it works. The problem is that I want to establish a connection only if the application runs on both devices .
Sometimes, when device A detects device B and tries to connect to it, it does not work until device B starts to find devices. Therefore, when I start a search on device B, it receives a connection request from A, but nothing before that.
In some other cases, after clicking the search button on device A, it shows some devices in which Wi-Fi is currently not activated or is not available .
Here is my code:
MainActivity.java
import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.net.wifi.WpsInfo; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pDeviceList; import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pManager.ActionListener; import android.net.wifi.p2p.WifiP2pManager.Channel; import android.net.wifi.p2p.WifiP2pManager.GroupInfoListener; import android.net.wifi.p2p.WifiP2pManager.PeerListListener; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity implements OnItemClickListener, PeerListListener { private WifiP2pManager mManager; private Channel mChannel; private BroadcastReceiver mReceiver; private IntentFilter mIntentFilter; private List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>(); private List<WifiP2pDevice> peersConnect = new ArrayList<WifiP2pDevice>(); private ArrayList<String> peersName = new ArrayList<String>(); private ListView list; private Button bSearch; private Button bConnect; private Button bDisconnect; private int nSelectedDevices = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); mChannel = mManager.initialize(this, getMainLooper(), null); try { Class<?> wifiManager = Class .forName("android.net.wifi.p2p.WifiP2pManager"); Method method = wifiManager .getMethod( "enableP2p", new Class[] { android.net.wifi.p2p.WifiP2pManager.Channel.class }); method.invoke(mManager, mChannel); } catch (Exception e) {
Wifireceiver.java
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.widget.Toast; public class WifiReceiver extends BroadcastReceiver { private WifiP2pManager mManager; private Channel mChannel; private MainActivity mActivity; public WifiReceiver(WifiP2pManager manager, Channel channel, MainActivity 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)) {
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearlayout1" > <Button android:id="@+id/searcher" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" /> <Button android:id="@+id/connecter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_connect" android:visibility="invisible" /> <Button android:id="@+id/disconnecter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_disconnect" android:visibility="invisible" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/linearlayout1" > <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="380dp" android:layout_alignParentLeft="true" android:visibility="invisible" > </ListView> </LinearLayout> " </RelativeLayout>
I do not understand how mManager.discoverPeers() and mManager.requestPeers() .
Thank you for attention!