MainActivity.java
package com.farproc.wifi.connecter; | |
import android.content.Intent; | |
import android.net.wifi.ScanResult; | |
import android.net.wifi.WifiConfiguration; | |
import android.net.wifi.WifiInfo; | |
import android.net.wifi.WifiManager; | |
import android.os.Bundle; | |
import android.widget.Toast; | |
public class MainActivity extends Floating { | |
public static final String EXTRA_HOTSPOT = "com.farproc.wifi.connecter.extra.HOTSPOT"; | |
private ScanResult mScanResult; | |
private Floating.Content mContent; | |
private WifiManager mWifiManager; | |
@Override | |
protected void onNewIntent (Intent intent) { | |
setIntent(intent); | |
// This activity has "singleInstance" launch mode. | |
// Update content to reflect the newest intent. | |
doNewIntent(intent); | |
} | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
mWifiManager = (WifiManager)getSystemService(WIFI_SERVICE); | |
doNewIntent(getIntent()); | |
} | |
private boolean isAdHoc(final ScanResult scanResule) { | |
return scanResule.capabilities.indexOf("IBSS") != -1; | |
} | |
private void doNewIntent(final Intent intent) { | |
mScanResult = intent.getParcelableExtra(EXTRA_HOTSPOT); | |
if(mScanResult == null) { | |
Toast.makeText(this, "No data in Intent!", Toast.LENGTH_LONG).show(); | |
finish(); | |
return; | |
} | |
if(isAdHoc(mScanResult)) { | |
Toast.makeText(this, R.string.adhoc_not_supported_yet, Toast.LENGTH_LONG).show(); | |
finish(); | |
return; | |
} | |
final String security = Wifi.ConfigSec.getScanResultSecurity(mScanResult); | |
final WifiConfiguration config = Wifi.getWifiConfiguration(mWifiManager, mScanResult, security); | |
if(config == null) { | |
mContent = new NewNetworkContent(this, mWifiManager, mScanResult); | |
} else { | |
final boolean isCurrentNetwork_ConfigurationStatus = config.status == WifiConfiguration.Status.CURRENT; | |
final WifiInfo info = mWifiManager.getConnectionInfo(); | |
final boolean isCurrentNetwork_WifiInfo = info != null | |
&& android.text.TextUtils.equals(info.getSSID(), mScanResult.SSID) | |
&& android.text.TextUtils.equals(info.getBSSID(), mScanResult.BSSID); | |
if(isCurrentNetwork_ConfigurationStatus || isCurrentNetwork_WifiInfo) { | |
mContent = new CurrentNetworkContent(this, mWifiManager, mScanResult); | |
} else { | |
mContent = new ConfiguredNetworkContent(this, mWifiManager, mScanResult); | |
} | |
} | |
setContent(mContent); | |
} | |
} |
=================================== wifi.java package com.farproc.wifi.connecter; | |
import java.util.Comparator; | |
import java.util.List; | |
import android.content.Context; | |
import android.net.wifi.ScanResult; | |
import android.net.wifi.WifiConfiguration; | |
import android.net.wifi.WifiManager; | |
import android.text.TextUtils; | |
import android.util.Log; | |
public class Wifi { | |
public static final ConfigurationSecurities ConfigSec = ConfigurationSecurities.newInstance(); | |
private static final String TAG = "Wifi Connecter"; | |
/** | |
* Change the password of an existing configured network and connect to it | |
* @param wifiMgr | |
* @param config | |
* @param newPassword | |
* @return | |
*/ | |
public static boolean changePasswordAndConnect(final Context ctx, final WifiManager wifiMgr, final WifiConfiguration config, final String newPassword, final int numOpenNetworksKept) { | |
ConfigSec.setupSecurity(config, ConfigSec.getWifiConfigurationSecurity(config), newPassword); | |
final int networkId = wifiMgr.updateNetwork(config); | |
if(networkId == -1) { | |
// Update failed. | |
return false; | |
} | |
// Force the change to apply. | |
wifiMgr.disconnect(); | |
return connectToConfiguredNetwork(ctx, wifiMgr, config, true); | |
} | |
/** | |
* Configure a network, and connect to it. | |
* @param wifiMgr | |
* @param scanResult | |
* @param password Password for secure network or is ignored. | |
* @return | |
*/ | |
public static boolean connectToNewNetwork(final Context ctx, final WifiManager wifiMgr, final ScanResult scanResult, final String password, final int numOpenNetworksKept) { | |
final String security = ConfigSec.getScanResultSecurity(scanResult); | |
if(ConfigSec.isOpenNetwork(security)) { | |
checkForExcessOpenNetworkAndSave(wifiMgr, numOpenNetworksKept); | |
} | |
WifiConfiguration config = new WifiConfiguration(); | |
config.SSID = convertToQuotedString(scanResult.SSID); | |
config.BSSID = scanResult.BSSID; | |
ConfigSec.setupSecurity(config, security, password); | |
int id = -1; | |
try { | |
id = wifiMgr.addNetwork(config); | |
} catch(NullPointerException e) { | |
Log.e(TAG, "Weird!! Really!! What's wrong??", e); | |
// Weird!! Really!! | |
// This exception is reported by user to Android Developer Console(https://market.android.com/publish/Home) | |
} | |
if(id == -1) { | |
return false; | |
} | |
if(!wifiMgr.saveConfiguration()) { | |
return false; | |
} | |
config = getWifiConfiguration(wifiMgr, config, security); | |
if(config == null) { | |
return false; | |
} | |
return connectToConfiguredNetwork(ctx, wifiMgr, config, true); | |
} | |
/** | |
* Connect to a configured network. | |
* @param wifiManager | |
* @param config | |
* @param numOpenNetworksKept Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT | |
* @return | |
*/ | |
public static boolean connectToConfiguredNetwork(final Context ctx, final WifiManager wifiMgr, WifiConfiguration config, boolean reassociate) { | |
final String security = ConfigSec.getWifiConfigurationSecurity(config); | |
int oldPri = config.priority; | |
// Make it the highest priority. | |
int newPri = getMaxPriority(wifiMgr) + 1; | |
if(newPri > MAX_PRIORITY) { | |
newPri = shiftPriorityAndSave(wifiMgr); | |
config = getWifiConfiguration(wifiMgr, config, security); | |
if(config == null) { | |
return false; | |
} | |
} | |
// Set highest priority to this configured network | |
config.priority = newPri; | |
int networkId = wifiMgr.updateNetwork(config); | |
if(networkId == -1) { | |
return false; | |
} | |
// Do not disable others | |
if(!wifiMgr.enableNetwork(networkId, false)) { | |
config.priority = oldPri; | |
return false; | |
} | |
if(!wifiMgr.saveConfiguration()) { | |
config.priority = oldPri; | |
return false; | |
} | |
// We have to retrieve the WifiConfiguration after save. | |
config = getWifiConfiguration(wifiMgr, config, security); | |
if(config == null) { | |
return false; | |
} | |
ReenableAllApsWhenNetworkStateChanged.schedule(ctx); | |
// Disable others, but do not save. | |
// Just to force the WifiManager to connect to it. | |
if(!wifiMgr.enableNetwork(config.networkId, true)) { | |
return false; | |
} | |
final boolean connect = reassociate ? wifiMgr.reassociate() : wifiMgr.reconnect(); | |
if(!connect) { | |
return false; | |
} | |
return true; | |
} | |
private static void sortByPriority(final List<WifiConfiguration> configurations) { | |
java.util.Collections.sort(configurations, new Comparator<WifiConfiguration>() { | |
@Override | |
public int compare(WifiConfiguration object1, | |
WifiConfiguration object2) { | |
return object1.priority - object2.priority; | |
} | |
}); | |
} | |
/** | |
* Ensure no more than numOpenNetworksKept open networks in configuration list. | |
* @param wifiMgr | |
* @param numOpenNetworksKept | |
* @return Operation succeed or not. | |
*/ | |
private static boolean checkForExcessOpenNetworkAndSave(final WifiManager wifiMgr, final int numOpenNetworksKept) { | |
final List<WifiConfiguration> configurations = wifiMgr.getConfiguredNetworks(); | |
sortByPriority(configurations); | |
boolean modified = false; | |
int tempCount = 0; | |
for(int i = configurations.size() - 1; i >= 0; i--) { | |
final WifiConfiguration config = configurations.get(i); | |
if(ConfigSec.isOpenNetwork(ConfigSec.getWifiConfigurationSecurity(config))) { | |
tempCount++; | |
if(tempCount >= numOpenNetworksKept) { | |
modified = true; | |
wifiMgr.removeNetwork(config.networkId); | |
} | |
} | |
} | |
if(modified) { | |
return wifiMgr.saveConfiguration(); | |
} | |
return true; | |
} | |
private static final int MAX_PRIORITY = 99999; | |
private static int shiftPriorityAndSave(final WifiManager wifiMgr) { | |
final List<WifiConfiguration> configurations = wifiMgr.getConfiguredNetworks(); | |
sortByPriority(configurations); | |
final int size = configurations.size(); | |
for(int i = 0; i < size; i++) { | |
final WifiConfiguration config = configurations.get(i); | |
config.priority = i; | |
wifiMgr.updateNetwork(config); | |
} | |
wifiMgr.saveConfiguration(); | |
return size; | |
} | |
private static int getMaxPriority(final WifiManager wifiManager) { | |
final List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks(); | |
int pri = 0; | |
for(final WifiConfiguration config : configurations) { | |
if(config.priority > pri) { | |
pri = config.priority; | |
} | |
} | |
return pri; | |
} | |
private static final String BSSID_ANY = "any"; | |
public static WifiConfiguration getWifiConfiguration(final WifiManager wifiMgr, final ScanResult hotsopt, String hotspotSecurity) { | |
final String ssid = convertToQuotedString(hotsopt.SSID); | |
if(ssid.length() == 0) { | |
return null; | |
} | |
final String bssid = hotsopt.BSSID; | |
if(bssid == null) { | |
return null; | |
} | |
if(hotspotSecurity == null) { | |
hotspotSecurity = ConfigSec.getScanResultSecurity(hotsopt); | |
} | |
final List<WifiConfiguration> configurations = wifiMgr.getConfiguredNetworks(); | |
if(configurations == null) { | |
return null; | |
} | |
for(final WifiConfiguration config : configurations) { | |
if(config.SSID == null || !ssid.equals(config.SSID)) { | |
continue; | |
} | |
if(config.BSSID == null || BSSID_ANY.equals(config.BSSID) || bssid.equals(config.BSSID)) { | |
final String configSecurity = ConfigSec.getWifiConfigurationSecurity(config); | |
if(hotspotSecurity.equals(configSecurity)) { | |
return config; | |
} | |
} | |
} | |
return null; | |
} | |
public static WifiConfiguration getWifiConfiguration(final WifiManager wifiMgr, final WifiConfiguration configToFind, String security) { | |
final String ssid = configToFind.SSID; | |
if(ssid.length() == 0) { | |
return null; | |
} | |
final String bssid = configToFind.BSSID; | |
if(security == null) { | |
security = ConfigSec.getWifiConfigurationSecurity(configToFind); | |
} | |
final List<WifiConfiguration> configurations = wifiMgr.getConfiguredNetworks(); | |
for(final WifiConfiguration config : configurations) { | |
if(config.SSID == null || !ssid.equals(config.SSID)) { | |
continue; | |
} | |
if(config.BSSID == null || BSSID_ANY.equals(config.BSSID) || bssid == null || bssid.equals(config.BSSID)) { | |
final String configSecurity = ConfigSec.getWifiConfigurationSecurity(config); | |
if(security.equals(configSecurity)) { | |
return config; | |
} | |
} | |
} | |
return null; | |
} | |
public static String convertToQuotedString(String string) { | |
if (TextUtils.isEmpty(string)) { | |
return ""; | |
} | |
final int lastPos = string.length() - 1; | |
if(lastPos > 0 && (string.charAt(0) == '"' && string.charAt(lastPos) == '"')) { | |
return string; | |
} | |
return "\"" + string + "\""; | |
} | |
} |
Ref : https://github.com/mkch/android-wifi-connecter/blob/master/src/com/farproc/wifi/connecter/MainActivity.java
沒有留言:
張貼留言