如何解决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网络。
再次。如果有人对此有更优雅的方法,请与我分享。谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。