问题描述
我遇到一个问题,我的设备在有效范围内时会停止自动连接到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网络。
再次。如果有人对此有更优雅的方法,请与我分享。谢谢。