You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 8.1获取已连接WiFi名称返回“unknown ssid”问题求助

Android 8.1 获取已连接WiFi SSID返回"unknown ssid"的解决方案

我之前在处理Android 8.1设备的WiFi SSID获取问题时,也碰到过一模一样的情况——明明加了位置权限,结果还是返回“unknown ssid”。后来排查下来,发现是几个容易忽略的小问题,给你一步步梳理:

1. 先修正代码里的权限检查逻辑(最关键的问题!)

你的代码里只针对Android 9.0(API 28,O_MR1)及以上做权限检查,但你的设备是Android 8.1(API 27),这段权限判断根本不会执行!等于完全没做权限校验就直接去拿SSID了,系统自然会返回“unknown”。

正确的做法是从**Android 6.0(API 23)**开始就检查位置权限,因为从这个版本开始位置权限属于危险权限,必须运行时申请:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    // 建议用ACCESS_FINE_LOCATION,部分设备用COARSE可能无法正常获取
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return getString(R.string.grant_location_permission_wifi_name)
    }
}

2. 确保清单文件里声明了所有必要权限

别漏了基础的WiFi状态权限,同时把位置权限也加上:

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

3. 必须开启系统位置服务

Android 8.1有个坑:就算你申请了位置权限,如果用户没打开系统的位置服务(GPS),还是拿不到正确的SSID。可以在代码里检测并引导用户开启:

val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    // 跳转到位置设置页面
    val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
    startActivity(intent)
}

4. 正确获取并处理WiFi SSID

最后,确保你的WiFiManager实例是正确获取的,并且处理SSID可能带双引号的情况:

val mWifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
if (mWifiManager.isWifiEnabled) {
    val wifiInfo = mWifiManager.connectionInfo
    val rawSsid = wifiInfo.ssid
    // 移除SSID自带的双引号
    val actualSsid = rawSsid.replace("\"", "")
    Log.d("WiFiDebug", "当前连接的WiFi名称: $actualSsid")
} else {
    // 提示用户先开启WiFi
}

按这几步调整后,应该就能正常获取到WiFi名称了。

内容的提问来源于stack exchange,提问作者Gurleen Sethi

火山引擎 最新活动