获取当前的Wifi SSID Android 10

问题描述

我尝试在Android 10上获取我的货币Wifi SSID。 Android 9或更低版本的代码不再起作用。 Android 10是否有示例?

关于Hacki

解决方法

从API 26(Android 8 Oreo)开始,您需要获得用户位置权限才能获取wifi名称(SSID),这就是为什么在Android 9(API 28),Android 10(API 29)或Android中也是如此11(API 30)及更高版本,您可能会获得<unknown name>作为返回的SSID或02:00:00:00:00:00

为此,在AndroidManifest.xml中:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我将提供一些用Kotlin编写的演示代码。

为了声明您的许可请求成功代码,我们将其存储在我们正在测试的类(在这种情况下为MainActivity)内部的一个伴随对象中(科特林用于存储常量),或者您可以为常量显式定义一个类。实际上是一种惯例。

class MainActivity : AppCompatActivity() {

    ...

    companion object {
        const val PERMISSION_CODE_ACCEPTED = 1
        const val PERMISSION_CODE_NOT_AVAILABLE = 0
    }
 
    ...
}

在您的测试活动中:

when(requestLocationPermission()){
    MainActivity.PERMISSION_CODE_ACCEPTED -> getWifiSSID()
}

用于检查请求权限:

fun requestLocationPermission(): Int {
        if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.ACCESS_FINE_LOCATION)) {
            } else {
                // request permission
                ActivityCompat.requestPermissions(this,arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),MainActivity.PERMISSION_CODE_ACCEPTED)
            }
        } else {
            // already granted
            return MainActivity.PERMISSION_CODE_ACCEPTED
        }

        // not available
        return MainActivity.PERMISSION_CODE_NOT_AVAILABLE
}

要实际获取SSID(WiFi名称):

fun getWifiSSID() {
        val mWifiManager: WifiManager = (this.getApplicationContext().getSystemService(Context.WIFI_SERVICE) as WifiManager)!!
        val info: WifiInfo = mWifiManager.getConnectionInfo()
    
        if (info.getSupplicantState() === SupplicantState.COMPLETED) {
            val ssid: String = info.getSSID()
            Log.d("wifi name",ssid)
        } else {
            Log.d("wifi name","could not obtain the wifi name")
        }
}

在API 29(Android 10)的仿真器上进行了测试。

2020-10-04 15:35:28.625 13013-13013/com.example.myapplication D/wifi name: "AndroidWifi"