大佬教程收集整理的这篇文章主要介绍了android – WifiP2pManager.requestPeers()不断返回onPeersAvailable()中的旧对等体,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题如下:我正在从android做wifip2p教程.我在MainActivity上使用此FloaTingActionButton手动调用discoverPeers().然后在WifiDirectBroadcastReceiver类中广播和接收WIFI_P2P_PEERS_CHANGED_ACTION.在那里我调用requestPeers(),它只在至少有一个可发现的对等体时调用onPeersAvailable()(这很有意义.)
然而问题是,一旦它发现了一个对等体,它将永远不会离开列表.即使我关闭检测到的设备.让我用一个例子来说明:
> 3个设备(A,B和C),全部支持wifi-direct.
>在设备A上启动应用程序,保持设备B和C关闭.
>尝试用A检测,没有检测到任何东西.没问题.
>打开设备B,转到wifi-direct设置,扫描.
>尝试用A检测,检测B.没问题.
>关闭设备B.
>尝试用A检测,没有检测到任何东西.没问题.
>打开设备C,检测C和B.但设备B仍然关闭.为什么它仍然被检测到? (最糟糕的是,它被检测到状态3,对应于AVAILABLE)
这种情况发生在设备角色的任何排列上.所以问题实际上在代码中,因为它们都通过官方的wifi-direct设置窗口正常运行和检测.
这是我的MainActivity:
package com.gett.wifip2ptest; import android.content.broadcastReceiver; import android.content.IntentFilter; import android.net.wifi.p2p.wifip2pDeviceList; import android.os.bundle; import android.support.design.widget.FloaTingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.content.Context; import android.net.wifi.p2p.@L_344_2@manager; import android.net.wifi.p2p.@L_344_2@manager.ChAnnel; import android.net.wifi.p2p.@L_344_2@manager.PeerListListener; import android.net.wifi.p2p.wifip2pDevice; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements PeerListListener{ private @L_344_2@manager mManager; private ChAnnel mChAnnel; private BroadcastReceiver mReceiver; privatE intentFilter mIntentFilter; private List<wifip2pDevice> peers = new ArrayList<wifip2pDevice>(); @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloaTingActionButton fab = (FloaTingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.onClickListener() { @Override public void onClick(View view) { Snackbar.make(view,"replace with your own action",Snackbar.LENGTH_LONG) .setAction("Action",null).show(); // If the discovery process succeeds and detects peers,the system broadcasts the // WIFI_P2P_PEERS_CHANGED_ACTION intent. mManager.discoverPeers(mChAnnel,new @L_344_2@manager.ActionListener() { @Override public void onsuccess() { Toast.makeText(MainActivity.this,"Discovery Initiated",Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int reasonCodE) { Toast.makeText(MainActivity.this,"Discovery Failed : " + reasonCode,Toast.LENGTH_SHORT).show(); } }); } }); mManager = (@L_344_2@manager) getSystemservice(Context.WIFI_P2P_serviCE); mChAnnel = mManager.initialize(this,getMainLooper(),null); mReceiver = new WiFiDirectBroadcastReceiver(mManager,mChAnnel,this); mIntentFilter = new IntentFilter(); mIntentFilter.addAction(@L_344_2@manager.WIFI_P2P_STATE_CHANGED_ACTION); mIntentFilter.addAction(@L_344_2@manager.WIFI_P2P_PEERS_CHANGED_ACTION); mIntentFilter.addAction(@L_344_2@manager.WIFI_P2P_CONNECTION_CHANGED_ACTION); mIntentFilter.addAction(@L_344_2@manager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); } /* register the broadcast receiver with thE intent values to be matched */ @Override protected void onResume() { super.onResume(); registerReceiver(mReceiver,mIntentFilter); } /* unregister the broadcast receiver */ @Override protected void onPause() { super.onPause(); unregisterReceiver(mReceiver); } @Override public Boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main,menu); return true; } @Override public Boolean onOptionsItemSELEcted(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button,so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_setTings) { return true; } return super.onOptionsItemSELEcted(item); } /** * This function is called by requestPeers upon receiving the peers list. * @param peerList */ @Override public void onPeersAvailable(wifip2pDeviceList peerList) { peers.clear(); System.out.println("Peers cleared : " + peers); peers.addAll(peerList.getDeviceList()); System.out.println("Peers : " + peers); if (peers.size() == 0) { System.out.println("No devices found"); return; } } }
这是WiFiDirectBroadCastReceiver:
package com.gett.wifip2ptest; import android.content.broadcastReceiver; import android.net.wifi.p2p.@L_344_2@manager; import android.net.wifi.p2p.@L_344_2@manager.ChAnnel; import android.net.wifi.p2p.@L_344_2@manager.PeerListListener; import android.content.Context; import android.content.Intent; public class WiFiDirectBroadcastReceiver extends BroadcastReceiver { private @L_344_2@manager mManager; private ChAnnel mChAnnel; private MainActivity mActivity; public WiFiDirectBroadcastReceiver(@L_344_2@manager 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 (@L_344_2@manager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { // check to see if Wi-Fi is enabled and notify appropriate activity int state = intent.getIntextra(@L_344_2@manager.EXTRA_WIFI_STATE,-1); if (state == @L_344_2@manager.WIFI_P2P_STATE_ENABLED) { // Wifi P2P is enabled System.out.println("Wifi Direct has been enabled."); } else { // Wi-Fi P2P is not enabled System.out.println("Wifi Direct is NOT enabled."); } } else if (@L_344_2@manager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { // Call @L_344_2@manager.requestPeers() to get a list of current peers System.out.println("Peers changed."); // request available peers from the wifi p2p manager. This is an // asynchronous call and the calling activity is notified with a // callBACk on PeerListlistener.onPeersAvailable() if (mManager != null) { mManager.requestPeers(mChAnnel,(PeerListListener) mActivity); } } else if (@L_344_2@manager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { // Respond to new connection or disconnections } else if (@L_344_2@manager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { // Respond to this device's wifi state changing } } }
02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: Peers : [Device: Galaxy J1-2 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: deviceAddress: 2a:27:bf:3a:2e:55 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: priMary type: 10-0050F204-5 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: secondary type: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: wps: 392 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: grpcapab: 0 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: devcapab: 37 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: status: 3 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: wfdInfo: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: groupownerAddress: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: GOdeviceName: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: interfaceAddress: 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: SConnecTinfo : null,Device: Test User (Galaxy J1) 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: deviceAddress: 2a:27:bf:3a:4a:8b 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: priMary type: 10-0050F204-5 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: secondary type: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: wps: 392 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: grpcapab: 0 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: devcapab: 37 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: status: 3 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: wfdInfo: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: groupownerAddress: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: GOdeviceName: null 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: interfaceAddress: 02-18 16:31:56.406 20833-20833/com.gett.wifip2ptest I/System.out: SConnecTinfo : null]
else if(@L_344_2@manager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){ //Log.d("wifi","WIFI PEERS CHANGED"); mPeers = new ArrayList<wifip2pDevice>(); mConfigs = new ArrayList<wifip2pConfig>(); if(mManager != null){ @L_344_2@manager.PeerListListener peerListListener = new @L_344_2@manager.PeerListListener(){ @Override public void onPeersAvailable(wifip2pDeviceList peerList) { mPeers.clear(); mPeers.addAll(peerList.getDeviceList()); mActivity.displayPeers(peerList); //mPeers.addAll(peerList.getDeviceList()); for(int i=0; i < peerList.getDeviceList().size(); i++){ wifip2pConfig config = new wifip2pConfig(); config.deviceAddress = mPeers.get(i).deviceAddress; mConfigs.add(config); } } }; mManager.requestPeers(mChAnnel,peerListListener); } }@H_829_5@mainActivity.java中的displayPeers()
public void displayPeers(wifip2pDeviceList peerList){ wifip2pArrayAdapter.clear(); for(wifip2pDevice peer: peerList.getDeviceList()){ wifip2pArrayAdapter.add(peer.deviceName + "\n" + peer.deviceAddress); } }
以上是大佬教程为你收集整理的android – WifiP2pManager.requestPeers()不断返回onPeersAvailable()中的旧对等体全部内容,希望文章能够帮你解决android – WifiP2pManager.requestPeers()不断返回onPeersAvailable()中的旧对等体所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。