问题描述
我尝试在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"