今天连接硬件设备的时候,需要用到wifi名和密码来进行绑定配对。在获取wifi名的时候,意外发现为空。于是就开始找寻解决方案。
后来找到这么一篇文章:
Android获取WIFI 的ssid 方法适配Android9.0
原来是因为在8.0以后,获取wifi的ssid的方法有所变动,所以后来的手机没办法直接获取wifi的ssid了。解决方法是对手机的版本进行判断,8.0以上版本的利用其他方法来获取ssid。
首先,获取权限是必须的,8.0以上的在 Androidmanifast 里添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
如果是9.0的话,还需要打开gps权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
添加完权限之后,9.0版本需要打开gps权限。具体打开方法可以参考其他权限的打开方式。
其次,就是主要的获取ssid的代码了。
/**
* 获取SSID
* @param activity 上下文
* @return WIFI 的SSID
*/
public String getWIFISSID(Activity activity) {
String ssid="unknown id";
if(Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1){//针对Android9.0 10.0 11.0的
ConnectivityManager connManager = (ConnectivityManager) mContext.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
assert connManager != null;
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if (networkInfo.isConnected()) {
if (networkInfo.getExtraInfo()!=null){
return networkInfo.getExtraInfo().replace("\"","");
}
}
}else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O||Build.VERSION.SDK_INT==Build.VERSION_CODES.P) {
WifiManager mWifiManager = (WifiManager) activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
assert mWifiManager != null;
WifiInfo info = mWifiManager.getConnectionInfo();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return info.getSSID();
} else {
return info.getSSID().replace("\"", "");
}
} else if (Build.VERSION.SDK_INT==Build.VERSION_CODES.O_MR1){
ConnectivityManager connManager = (ConnectivityManager) activity.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
assert connManager != null;
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if (networkInfo.isConnected()) {
if (networkInfo.getExtraInfo()!=null){
return networkInfo.getExtraInfo().replace("\"","");
}
}
}
return ssid;
}
其中,如果用的sdk过低的话,可能会造成Build.VERSION_CODES的数据丢失,找不到对应的代码。如果遇到这种情况,可以改成:
// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O||Build.VERSION.SDK_INT==Build.VERSION_CODES.P) {
if (Build.VERSION.SDK_INT <= 26||Build.VERSION.SDK_INT==28) {
...
// } else if (Build.VERSION.SDK_INT==Build.VERSION_CODES.O_MR1){
} else if (Build.VERSION.SDK_INT==27){
...
}
这样就可以获取到wifi的ssid了。
附:打开权限的方法:
Activity.java
// 调用权限检查。
public class Activity extends AppCompatActivity {
// 所需的全部权限
static final String[] PERMISSIONS = new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION
};
private PermissionsChecker mPermissionsChecker;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mPermissionsChecker = new PermissionsChecker(this);
if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
startPermissionsActivity();
}else {
ITAMachine.startMachine(context, globalHandler,false);
}
...
}
}
PermissionsChecker.java
/**
* Created by Dev01 on 2017/4/19.
*/
public class PermissionsChecker {
private final Context mContext;
public PermissionsChecker(Context context) {
mContext = context.getApplicationContext();
}
// 判断权限集合
public boolean lacksPermissions(String... permissions) {
for (String permission : permissions) {
if (lacksPermission(permission)) {
return true;
}
}
return false;
}
// 判断是否缺少权限
private boolean lacksPermission(String permission) {
return ContextCompat.checkSelfPermission(mContext, permission) ==
PackageManager.PERMISSION_DENIED;
}
}