为何要收藏这篇干货?------番茄憨憨的自我独白
我是番茄憨憨,我要坦白。
好记性不如烂笔头,对于常用的一些接口,出于其简单性,有些时候我们觉得没有记笔记的必要,但当真正用的时候,又得花费一段时间去搜索,踩过的坑不能再踩第二次,这里憨憨整理了自己比较常用的一些接口,Android-wifi常用接口,9个里面你看看几个对你有帮助!
使用接口需要导入的包:
java
import android.net.wifi.WifiManager;
import android.net.ConnectivityManager;
import android.telephony.TelephonyManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.SupplicantState;
一、判断是否插卡
对于ap来说,有些时候需要监听是否插卡.
java
private boolean isNoSimcard(){
TelephonyManager telMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
int simState = telMgr.getSimState();
switch (simState) {
case TelephonyManager.SIM_STATE_ABSENT:
case TelephonyManager.SIM_STATE_UNKNOWN:
case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
return true;
}
return false;
}
二、判断是否在飞行模式
遇到在飞行模式下,wifi sta和ap的定制需求时可用
java
//添加飞行模式的广播action
Intent intentFilter = new Intent();
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
//在注册的广播中判断当前action是否是飞行模式action,如果是,可在接收到广播后定制sta或ap的需求。如下是做了一个飞模开,wifi关,飞模关,wifi恢复到前一状态的定制。
if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){
boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
Log.d(TAG,"isAirplaneModeOn == " + isAirplaneModeOn);
if(isAirplaneModeOn){
if(mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);
Settings.Global.putInt(mContext.getContentResolver(), "pre_wifi_state", 1);
} else {
Settings.Global.putInt(mContext.getContentResolver(), "pre_wifi_state", 0);
}
} else {
int wifi_state = Settings.Global.getInt(mContext.getContentResolver(),"pre_wifi_state",0);
if (wifi_state == 1){
mWifiManager.setWifiEnabled(true);
} else {
Log.d(TAG,"pre_wifi_state is turn off");
}
}
}
三、判断当前网络是否已连接
注意:只要是有网络的情况下,此接口都会生效
java
/**
* 判断当前是否有网
*/
public boolean hasInternet(){
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
四、判断当前网络类型是否为WiFi
网络类型有多种,由Connectivity统一管理,如只需要判断有网无网,使用三的接口即可,但如果你进一步想判断当前网络类型是否为WiFi,下面的接口能够对其进行区分。
ruby
/**
* 判断当前网络是否为WiFi
*/
public static boolean isConnectedToWiFi(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 对于API 23及以上版本
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
} else {
// 对于API 23以下版本
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected();
}
}
return false;
}
五、WiFi状态设置和判断
通过WifiManager接口来控制,实际上大部分和Wifi相关,在WifiManager中是能找到相关接口的。
scss
//启用或关闭wifi
mWifiManager.setWifiEnabled(true||false);
//检测wifi是否开启
mWifiManager.isWifiEnabled();
//检测Ap是否开启
mWifiManager.isWifiApEnabled();
六、获取当前连接wifi的频段信息
下面举了一个获取一个连接wifi频段信息的例子,如果想要获取更多连接wifi的信息,可以通过打印WifiInfo完整查看.
scss
/**
* BAND1(5.2G):5.15~5.25G
* BAND2(5.3G):5.25~5.35G
* BAND3(5.5G):5.47~5.725G
* BAND4(5.8G):5.725~5.85G
* BAND0(2.4G):2.4~2.484G
*
* @return
*/
private int getFrequencyRange() {
int frequency = getCurrentFrequency(mContext);
if (frequency > 5150 && frequency < 5250) {
return WIFI_5G2;
}
if (frequency > 5250 && frequency < 5350) {
return WIFI_5G3;
}
if (frequency > 5470 && frequency < 5725) {
return WIFI_5G5;
}
if (frequency > 5725 && frequency < 5850) {
return WIFI_5G8;
}
if (frequency > 2400 && frequency < 2484) {
return WIFI_2G4;
}
return WIFI_ERR;
}
private static int getCurrentFrequency(Context context) {
WifiManager wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
List<ScanResult> scanResults = wifiManager.getScanResults();
for (ScanResult result : scanResults) {
if (result.BSSID.equalsIgnoreCase(wifiInfo.getBSSID())
&& result.SSID.equalsIgnoreCase(wifiInfo.getSSID()
.substring(1, wifiInfo.getSSID().length() - 1))) {
Slog.d(TAG, "getCurrentFrequency frequency: " + result.frequency);
return result.frequency;
}
}
return -1;
}
七、广播监听WiFi扫描结果.
scss
//注册扫描的IntentFilter和广播
IntentFilter mScanResultsAvailable =
new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(mScanResultsReceiver, mScanResultsAvailable);
private BroadcastReceiver mScanResultsReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
List<ScanResult> results = mWifiManager.getScanResults();
for(ScanResult result : results) {
//这里将接收到每一个扫描到的对象,可对其进行处理
}
}
};
八、广播监听WiFi状态变化.
java
//注册wifi状态变化的IntentFilter和广播
IntentFilter mWifiStateIntent = new IntentFilter(
WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mWifiStateReceiver, mWifiStateIntent);
private BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context wifiState_context,
Intent wifiState_intent) {
wifiUtils.slog("wifiActivity:: mWifiStateReceiver onReceive");
String action = wifiState_intent.getAction();
int wifiState = wifiState_intent.getIntExtra(
WifiManager.EXTRA_WIFI_STATE, 0);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLING:
wifiUtils.slog("wifiActivity:: Wifi state : DISABLING");
break;
case WifiManager.WIFI_STATE_DISABLED:
wifiUtils.slog("wifiActivity:: Wifi state : DISABLED");
break;
case WifiManager.WIFI_STATE_ENABLING:
wifiUtils.slog("wifiActivity:: Wifi state : ENABLING");
break;
case WifiManager.WIFI_STATE_ENABLED:
wifiUtils.slog("wifiActivity:: Wifi state : ENABLED");
break;
case WifiManager.WIFI_STATE_UNKNOWN:
wifiUtils.slog("wifiActivity:: Wifi state : UNKNOWN");
break;
default:
wifiUtils.slog("wifiActivity:: Wifi state : BAD");
break;
}
}
};
九、广播监听WiFi认证状态.
scss
//注册supplicant状态变更的IntentFilter和广播
IntentFilter mSupplicantStateIntent = new IntentFilter(
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
registerReceiver(mSupplicantStateReceiver, mSupplicantStateIntent);
private BroadcastReceiver mSupplicantStateReceiver =
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
wifiUtils.slog("wifiActivity:: mSupplicantStateReceiver onReceive");
String action = intent.getAction();
if(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
wifiUtils.slog("wifiActivity:: action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)");
SupplicantState supplicantState = ((SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE));
//SupplicantState包含非常多的wifi认证状态,可连接一次wifi具体打印机supplicantState值出来观察wifi在每个阶段的连接.
supplicantState.equals(SupplicantState.COMPLETED))
};