【发布时间】:2020-10-04 12:05:23
【问题描述】:
我尝试在 Android 10 上获取我当前的 Wifi SSID。 Android 9 或更低版本的代码不再工作。 是否有适用于 Android 10 的示例。
问候哈基
【问题讨论】:
标签: android android-wifi wifimanager android-developer-api
我尝试在 Android 10 上获取我当前的 Wifi SSID。 Android 9 或更低版本的代码不再工作。 是否有适用于 Android 10 的示例。
问候哈基
【问题讨论】:
标签: android android-wifi wifimanager android-developer-api
由于 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"
【讨论】:
将他的两个权限请求设置到您的项目清单文件中:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"\>
您必须使用 Android 的设置屏幕手动设置Application permission。
【讨论】: