关于Android 8.0/9.0 之后获取wifi名称为空的解决方法

今天连接硬件设备的时候,需要用到wifi名和密码来进行绑定配对。在获取wifi名的时候,意外发现为空。于是就开始找寻解决方案。

后来找到这么一篇文章:

Android获取WIFI 的ssid 方法适配Android9.0

原来是因为在8.0以后,获取wifi的ssid的方法有所变动,所以后来的手机没办法直接获取wifi的ssid了。解决方法是对手机的版本进行判断,8.0以上版本的利用其他方法来获取ssid。

首先,获取权限是必须的,8.0以上的在 Androidmanifast 里添加


 

如果是9.0的话,还需要打开gps权限



 

添加完权限之后,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||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;
    }
}

 

你可能感兴趣的:(关于Android 8.0/9.0 之后获取wifi名称为空的解决方法)