....................
//Open按键点击后的逻辑
mOpenWifiButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//WifiManager的isWifiEnabled接口,用于判断Wifi开关是否已经开启
if (!mWifiManager.isWifiEnabled()) {
//setWifiEnabled接口用于开启Wifi
mWifiManager.setWifiEnabled(true);
mMainHandler.post(mMainRunnable);
}
}
});
....................
................
private Runnable mMainRunnable = new Runnable() {
@Override
public void run() {
if (mWifiManager.isWifiEnabled()) {
//开启成功后,使能Get按键
mGetWifiInfoButton.setEnabled(true);
} else {
mMainHandler.postDelayed(mMainRunnable, 1000);
}
}
};
..............
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
.................
mGetWifiInfoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mWifiManager.isWifiEnabled()) {
//getScanResults接口将返回List<ScanResult>
//ScanResult中保留了每个接入点的基本信息
mScanResultList = mWifiManager.getScanResults();
//多个接入点可能携带相同的信息,形成一个整体的Wifi覆盖网络
//因此,筛除一些冗余信息
sortList(mScanResultList);
//我使用的是RecyclerView,得到数据后,刷新界面进行显示
mWifiInfoRecyclerView.getAdapter().notifyDataSetChanged();
}
}
});
.................
..............
private void sortList(List<ScanResult> list) {
TreeMap<String, ScanResult> map = new TreeMap<>();
//demo中仅按照SSID进行筛选
//实际使用时,还可以参考信号强度等条件
for (ScanResult scanResult : list) {
map.put(scanResult.SSID, scanResult);
}
list.clear();
list.addAll(map.values());
}
.............
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
public List<ScanResult> getScanResults(String callingPackage) {
//这里要求的是ACCESS_WIFI_STATE
enforceAccessPermission();
............
try {
...........
if (!canReadPeerMacAddresses && !isActiveNetworkScorer
//在checkCallerCanAccessScanResults中检查了ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION
//如果没有这两个权限,就会返回一个empty List
&& !checkCallerCanAccessScanResults(callingPackage, uid)) {
return new ArrayList<ScanResult>();
}
...........
} fianlly {
..........
}
}
...............
private class ScanResultViewHolder extends RecyclerView.ViewHolder {
private View mView;
private TextView mWifiName;
private TextView mWifiLevel;
ScanResultViewHolder(View itemView) {
super(itemView);
mView = itemView;
mWifiName = (TextView) itemView.findViewById(R.id.ssid);
mWifiLevel = (TextView) itemView.findViewById(R.id.level);
}
void bindScanResult(final ScanResult scanResult) {
//将接入点的名称和强度显示到界面上
mWifiName.setText(
getString(R.string.scan_wifi_name, "" + scanResult.SSID));
mWifiLevel.setText(
getString(R.string.scan_wifi_level, "" + scanResult.level));
//点击Item后,就连接对应的接入点
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//createWifiConfig主要用于构建一个WifiConfiguration,代码中的例子主要用于连接不需要密码的Wifi
//WifiManager的addNetwork接口,传入WifiConfiguration后,得到对应的NetworkId
int netId = mWifiManager.addNetwork(createWifiConfig(scanResult.SSID, "", WIFICIPHER_NOPASS));
//WifiManager的enableNetwork接口,就可以连接到netId对应的wifi了
//其中boolean参数,主要用于指定是否需要断开其它Wifi网络
boolean enable = mWifiManager.enableNetwork(netId, true);
Log.d("ZJTest", "enable: " + enable);
//可选操作,让Wifi重新连接最近使用过的接入点
//如果上文的enableNetwork成功,那么reconnect同样连接netId对应的网络
//若失败,则连接之前成功过的网络
boolean reconnect = mWifiManager.reconnect();
Log.d("ZJTest", "reconnect: " + reconnect);
}
});
}
}
.................
....................
private static final int WIFICIPHER_NOPASS = 0;
private static final int WIFICIPHER_WEP = 1;
private static final int WIFICIPHER_WPA = 2;
private WifiConfiguration createWifiConfig(String ssid, String password, int type) {
//初始化WifiConfiguration
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
//指定对应的SSID
config.SSID = "\"" + ssid + "\"";
//如果之前有类似的配置
WifiConfiguration tempConfig = isExist(ssid);
if(tempConfig != null) {
//则清除旧有配置
mWifiManager.removeNetwork(tempConfig.networkId);
}
//不需要密码的场景
if(type == WIFICIPHER_NOPASS) {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
//以WEP加密的场景
} else if(type == WIFICIPHER_WEP) {
config.hiddenSSID = true;
config.wepKeys[0]= "\""+password+"\"";
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
//以WPA加密的场景,自己测试时,发现热点以WPA2建立时,同样可以用这种配置连接
} else if(type == WIFICIPHER_WPA) {
config.preSharedKey = "\""+password+"\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
.................
private WifiConfiguration isExist(String ssid) {
List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
for (WifiConfiguration config : configs) {
if (config.SSID.equals("\""+ssid+"\"")) {
return config;
}
}
return null;
}
.................
...................
private BroadcastReceiver mBroadcastReceiver;
private void registerBroadcastReceiver() {
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//收到广播后,利用"wifi_state"的字段,得到AP的状态
int state = intent.getIntExtra("wifi_state", 11);
Log.d("ZJTest", "AP state: " + state);
}
};
IntentFilter intentFilter = new IntentFilter();
//添加Action对应的字符信息
intentFilter.addAction("android.net.wifi.WIFI_AP_STATE_CHANGED");
this.registerReceiver(mBroadcastReceiver, intentFilter);
}
.........
private void unregisterBroadcastReceiver() {
this.unregisterReceiver(mBroadcastReceiver);
}
..........
//对应WIFI_AP_STATE_ENABLED,定义于WifiManager中,@SystemApi 02-20 17:48:52.470 12773-12773/? D/ZJTest: AP state: 13
//WIFI_AP_STATE_DISABLING 02-20 17:49:35.803 12773-12773/stark.a.is.zhang.wifitest D/ZJTest: AP state: 10 //WIFI_AP_STATE_DISABLED 02-20 17:49:36.960 12773-12773/stark.a.is.zhang.wifitest D/ZJTest: AP state: 11
public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) public WifiConfiguration getWifiApConfiguration()
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-3 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2026 源码网商城 (www.yuanmawang.com) 版权所有