【问题标题】:Get current Wifi SSID Android 10获取当前 Wifi SSID Android 10
【发布时间】:2020-10-04 12:05:23
【问题描述】:

我尝试在 Android 10 上获取我当前的 Wifi SSID。 Android 9 或更低版本的代码不再工作。 是否有适用于 Android 10 的示例。

问候哈基

【问题讨论】:

    标签: android android-wifi wifimanager android-developer-api


    【解决方案1】:

    由于 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)内的伴随对象(用于存储常量的 Kotlin 方式)中,或者您可以为常量显式定义一个类,即实际上是一种常见的做法。

    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"
    

    【讨论】:

    • 你好,我试过这个并用 Java 重写了代码。并得到“D/wifi 名称:”。我确实在清单中设置了所有权限。我是否需要在代码中明确请求权限,或者是否足以在清单中拥有它?哈基
    【解决方案2】:

    将他的两个权限请求设置到您的项目清单文件中:

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

    您必须使用 Android 的设置屏幕手动设置Application permission

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2021-02-13
      • 2019-03-01
      • 2017-01-13
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多