【问题标题】:How to get wifi SSID on api 27 (android 8.1)?如何在 api 27 (android 8.1) 上获取 wifi SSID?
【发布时间】:2018-10-31 02:09:35
【问题描述】:

我想在 Android 8.1 中获取已连接 WiFi 的名称。当我获得 SSID 时,它返回“未知 ssid”。 Stack-overflow 上的一些答案说要获得位置权限。我什至这样做了,但问题仍然存在。但是当我打开手机下拉菜单中的位置图标时(就像打开 GPS 或网络位置一样),它工作正常。但是我觉得在系统设置里打开定位太麻烦了。反正有没有像那样手动打开位置来获得 ssid ?或者我可以在我的应用程序中打开定位吗?

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return getString(R.string.grant_location_permission_wifi_name)
    }
}

val wifiInfo = mWifiManager.connectionInfo.ssid

【问题讨论】:

  • developer.android.com/reference/android/net/wifi/… ...询问如何在奥利奥上获得它并没有真正意义,因为什么都没有改变。 ScanResult 从 API 级别 1 开始可用。
  • @MartinZeitler 我在answer中添加了一些引用,有些API级别其实有这个问题,所以OP没有错

标签: android


【解决方案1】:

目前,权限本身还不够,必须启用定位服务才能使用WifiManager.getScanResults 和WifiManager.getConnectionInfo。

在 AOSP 跟踪器中有一个关于此问题的 issue,但尚未修复。 您实际上可以看到人们 mentioning 删除了开发人员关于为 tartgetSdk

供参考:enforceCanAccessScanResults 检查位置是否启用:

public void enforceCanAccessScanResults(String pkgName, int uid) 
                                            throws SecurityException {
    ...
    // Location mode must be enabled
    if (!isLocationModeEnabled()) {
        // Location mode is disabled, scan results cannot be returned
        throw new SecurityException("Location mode is disabled for the device");
    }
    ...
}

它在WifiManager的getScanResults中被调用:

@Override
public List<ScanResult> getScanResults(String callingPackage) {
    ...
    try {
        //this checks permissions and location mode
        mWifiPermissionsUtil.enforceCanAccessScanResults(callingPackage, uid);
        ...
    } catch (SecurityException e) {
        return new ArrayList<ScanResult>();
    } 
    ...
}

TLDR
必须打开位置服务才能获取网络的 SSID, 如果它关闭,那么您可以提示用户更改位置设置like this(更好的用户体验),或者您可以将用户重定向到设置页面:

Intent gpsOptionsIntent = new Intent(  
    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
startActivity(gpsOptionsIntent);

作为最后一个选项,你可以尝试使用ConnectivityManager的getActiveNetworkInfo:

    val cm = ContextCompat.getSystemService(context, ConnectivityManager::class.java)

    val ssid: String? = cm?.activeNetworkInfo?.extraInfo

【讨论】:

  • 谢谢,但是如何开启定位服务呢?我可以在我的代码中启用它吗?
  • 我知道 tartgetSdk = 26
  • 它可以工作,我知道它可以工作。虽然这不是我想要的答案,但谢谢你给我一些关于这个问题的信息。其实有个叫“萤石”的app不需要手动开启定位服务,只需要给定位权限,然后就可以得到正确的WIFISSID,不知道他们是怎么做到的。所以我在这里发帖寻求帮助。谢谢。
  • 你发的最后一个不是常规方式,对于android 8.1的某些设备是可以的,但对于android 9.0就不行了。非常感谢。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2021-02-05
  • 2018-09-17
相关资源
最近更新 更多