WiFi P2P是否导致设备WiFi自动连接功能不起作用?

问题描述

我遇到一个问题,我的设备在有效范围内时会停止自动连接到WiFi网络。我的应用程序具有一项在后台运行的服务(即使该应用程序被杀死),该服务每分钟都会注册和注销一次服务,以便使用WiFi P2P重复检测附近的设备。

 private final broadcastReceiver broadcastReceiver = new broadcastReceiver() {
        @Override
        public void onReceive(Context context,Intent intent) {
            String action = intent.getAction();
            if (wifip2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                int state = intent.getIntExtra(wifip2pManager.EXTRA_WIFI_STATE,-1);
                if (state == wifip2pManager.WIFI_P2P_STATE_ENABLED) {
                    Log.d(TAG,"WiFi P2P Enabled");
                    if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    manager.discoverPeers(channel,new wifip2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            Log.d(TAG,"discover Peers Successful");
                        }

                        @Override
                        public void onFailure(int i) {
                            Log.d(TAG,"discover Peers Unsuccessful");
                        }
                    });
                } else {
                    Log.d(TAG,"WiFi P2P disabled");
                }
                // Check to see if Wi-Fi is enabled and notify appropriate activity
            } else if (wifip2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
                Log.d(TAG,"Peers detected");
                if (manager != null) {
                    if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    Log.d(TAG,"Peers Requested");
                    manager.requestPeers(channel,peerListListener);
                }
                // Call wifip2pManager.requestPeers() to get a list of current peers
            } else if (wifip2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                Log.d(TAG,"Connection Changed");
                // Respond to new connection or disconnections
            } else if (wifip2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
                Log.d(TAG,"WiFi P2P State Changed");
                // Respond to this device's wifi state changing
            }
        }
    };

 wifip2pManager.PeerListListener peerListListener = new wifip2pManager.PeerListListener() {
        @Override
        public void onPeersAvailable(wifip2pDeviceList wifip2pDeviceList) {
            Log.d(TAG,"Peers available");
            String deviceEncrypt = "";

            if (!wifip2pDeviceList.getDeviceList().equals(peers)) {
                peers.clear();
                peers.addAll(wifip2pDeviceList.getDeviceList());

                deviceNameArray = new String[wifip2pDeviceList.getDeviceList().size()];
                deviceArray = new wifip2pDevice[wifip2pDeviceList.getDeviceList().size()];
                int index = 0;

                for (wifip2pDevice device : wifip2pDeviceList.getDeviceList()) {
                    deviceNameArray[index] = device.deviceName;
                    deviceArray[index] = device;
                    index++;

                    try {
                        deviceEncrypt = AESUtils.encrypt(device.deviceAddress);
                        Log.d(TAG,"Encrypted MAC Address discovered: " + deviceEncrypt);
                    } catch (Exception e) {
                        e.printstacktrace();
                    }
                }
            } else {
                Log.d(TAG,"No peers found");
            }
        }
    };

我意识到这可以防止设备在有效范围内自动连接到已知的WiFi网络。任何想法如何解决这个问题?下面的代码每分钟都会注册和注销一次broadcastReceiver,以实现一致的对等检测(此操作在onStartCommand函数中运行)。

private void refreshTime() {
        handler.postDelayed(runnable = new Runnable() {
            @Override
            public void run() {
                Log.d(TAG,"Refreshed");
                registerReceiver(broadcastReceiver,intentFilter);
                unregisterReceiver(broadcastReceiver);
                registerReceiver(broadcastReceiver,intentFilter);
                handler.postDelayed(runnable,delay);
            }
        },delay);
    }

解决方法

回答我自己的问题。因此,manager.discoverPeers是阻止Android自动连接到已知Wifi网络的原因。我通过将refreshTime()拆分为两个不同的函数来解决此问题。

private void refreshTime() {
        refreshHandler.postDelayed(refreshRunnable = new Runnable() {
            @Override
            public void run() {
                Log.d(TAG,"Refreshed Registered");
                registerReceiver(broadcastReceiver,intentFilter);
                refreshHandler.postDelayed(refreshRunnable,refreshDelay);
            }
        },refreshDelay);
    }

private void stopDiscovery() {
        peerHandler.postDelayed(peerRunnable = new Runnable() {
            @Override
            public void run() {
                manager.stopPeerDiscovery(channel,new WifiP2pManager.ActionListener() {
                    @Override
                    public void onSuccess() {
                        Log.d(TAG,"Peer Discovery Stopped");
                        try {
                            unregisterReceiver(broadcastReceiver);
                            Log.d(TAG,"Refreshed Unregistered");
                        } catch (IllegalArgumentException e) {
                            Log.e(TAG,e.toString());
                        }
                    }

                    @Override
                    public void onFailure(int i) {
                        Log.d(TAG,"Peer Discovery Failed to Stop");
                    }
                });
                peerHandler.postDelayed(peerRunnable,peerDelay);
            }
        },peerDelay);
    }

stopDiscovery()调用manager.stopPeerDiscovery()并在onSuccess上取消注册broadcastReceiver。

两者都以两个不同的间隔运行。 refreshTime()每1分钟运行一次,而stopDiscovery()每2分钟运行一次。这将使discoverPeers()停止一分钟,并使操作系统自动连接到已知的Wifi网络。

再次。如果有人对此有更优雅的方法,请与我分享。谢谢。