Android扫描WIFI权限功能怎么实现

其他教程   发布日期:2023年09月15日   浏览次数:583

这篇文章主要介绍“Android扫描WIFI权限功能怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android扫描WIFI权限功能怎么实现”文章能帮助大家解决问题。

权限

根据官方文档描述,扫描WIFI需要申请相关权限,如下:

Android 13以上

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android">
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  4. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  5. <!--在Android13以上,当usesPermissionFlags设置为neverForLocation时,无需再申请ACCESS_FINE_LOCATION权限-->
  6. <uses-permission
  7. android:name="android.permission.NEARBY_WIFI_DEVICES"
  8. android:usesPermissionFlags="neverForLocation" />
  9. </manifest>

Android 13以下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android">
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  4. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  5. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  6. </manifest>

需要注意,在实际测试中,Android 13以上的设备仍然需要申请

  1. android.permission.ACCESS_FINE_LOCATION
才能扫描到WIFI,测试设备为小米13。

注册广播监听扫描状态

通过注册广播监听WIFI扫描是否完成,代码如下:

  1. class WIFIExampleActivity : AppCompatActivity() {
  2. private val scanResultReceiver = object : BroadcastReceiver() {
  3. override fun onReceive(context: Context?, intent: Intent?) {
  4. if (intent?.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false) == true) {
  5. // 扫描完成
  6. }
  7. }
  8. }
  9. override fun onCreate(savedInstanceState: Bundle?) {
  10. super.onCreate(savedInstanceState)
  11. // 注册广播
  12. registerReceiver(scanResultReceiver, IntentFilter().apply {
  13. addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
  14. })
  15. }
  16. override fun onDestroy() {
  17. super.onDestroy()
  18. // 移除广播
  19. unregisterReceiver(scanResultReceiver)
  20. }
  21. }

扫描WIFI

通过WifiManager扫描WIFI,并获取扫描结果,代码如下:

  1. // 列表适配器
  2. class WIFIAdapter : RecyclerView.Adapter<WIFIAdapter.WIFIViewHolder>() {
  3. private val wifiData = ArrayList<WIFIEntity>()
  4. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WIFIViewHolder {
  5. return WIFIViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.layout_wifi_item, parent, false))
  6. }
  7. override fun onBindViewHolder(holder: WIFIViewHolder, position: Int) {
  8. wifiData[position].run {
  9. holder.tvWifiName.text = wifiSSID
  10. holder.tvWifiSSID.text = wifiBSSID
  11. holder.ivWifiStrength.setImageResource(getStrengthIcon(wifiStrength))
  12. holder.ivNeedPassword.setImageResource(if (needPassword) R.drawable.icon_lock else R.drawable.icon_unlock)
  13. }
  14. }
  15. override fun getItemCount(): Int {
  16. return wifiData.size
  17. }
  18. fun setNewData(wifiData: ArrayList<WIFIEntity>?) {
  19. val lastItemCount = itemCount
  20. if (lastItemCount != 0) {
  21. this.wifiData.clear()
  22. notifyItemRangeRemoved(0, lastItemCount)
  23. }
  24. wifiData?.let { this.wifiData.addAll(it) }
  25. notifyItemChanged(0, itemCount)
  26. }
  27. private fun getStrengthIcon(wifiStrength: Int): Int {
  28. return when (wifiStrength) {
  29. 0 -> R.drawable.wifi_strength_0
  30. 1 -> R.drawable.wifi_strength_1
  31. 2 -> R.drawable.wifi_strength_2
  32. else -> R.drawable.wifi_strength_3
  33. }
  34. }
  35. interface ItemClickListener {
  36. fun onItemClick(wifiInfo: WIFIEntity)
  37. }
  38. class WIFIViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
  39. val tvWifiName: AppCompatTextView = itemView.findViewById(R.id.tv_wifi_name)
  40. val tvWifiSSID: AppCompatTextView = itemView.findViewById(R.id.tv_wifi_ssid)
  41. val ivNeedPassword: AppCompatImageView = itemView.findViewById(R.id.iv_need_password)
  42. val ivWifiStrength: AppCompatImageView = itemView.findViewById(R.id.iv_wifi_strength)
  43. }
  44. }
  45. class WIFIExampleActivity : AppCompatActivity() {
  46. private lateinit var binding: LayoutWifiExampleActivityBinding
  47. private val wifiAdapter = WIFIAdapter()
  48. private var wifiManager: WifiManager? = null
  49. private var requestPermissionName: String = Manifest.permission.ACCESS_FINE_LOCATION
  50. private val requestSinglePermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted: Boolean ->
  51. if (granted) {
  52. // 申请定位权限通过,扫描WIFI
  53. if (wifiManager?.isWifiEnabled == true) {
  54. wifiManager?.startScan()
  55. }
  56. } else {
  57. //未同意授权
  58. if (!shouldShowRequestPermissionRationale(requestPermissionName)) {
  59. //用户拒绝权限并且系统不再弹出请求权限的弹窗
  60. //这时需要我们自己处理,比如自定义弹窗告知用户为何必须要申请这个权限
  61. }
  62. }
  63. }
  64. private val scanResultReceiver = object : BroadcastReceiver() {
  65. override fun onReceive(context: Context?, intent: Intent?) {
  66. if (intent?.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false) == true) {
  67. val wifiData = ArrayList<WIFIEntity>()
  68. wifiManager?.scanResults?.forEach {
  69. val ssid = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
  70. it.wifiSsid.toString()
  71. } else {
  72. it.SSID
  73. }
  74. val bssid = it.BSSID
  75. // 获取WIFI加密类型
  76. val capabilities = it.capabilities
  77. // 获取WIFI信号强度
  78. val level = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  79. wifiManager?.calculateSignalLevel(it.level) ?: 0
  80. } else {
  81. WifiManager.calculateSignalLevel(it.level, 4)
  82. }
  83. wifiData.add(WIFIEntity(ssid, bssid, capabilities.contains("wpa", true) || capabilities.contains("web", true), capabilities, level))
  84. }
  85. // 根据信号强度降序排列
  86. wifiData.sortByDescending { it.wifiStrength }
  87. wifiAdapter.setNewData(wifiData)
  88. }
  89. }
  90. }
  91. override fun onCreate(savedInstanceState: Bundle?) {
  92. super.onCreate(savedInstanceState)
  93. binding = DataBindingUtil.setContentView(this, R.layout.layout_wifi_example_activity)
  94. wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
  95. binding.includeTitle.tvTitle.text = "WIFI Example"
  96. binding.btnStartScan.setOnClickListener {
  97. // 检测定位权限
  98. if (ActivityCompat.checkSelfPermission(this, requestPermissionName) == PackageManager.PERMISSION_GRANTED) {
  99. if (wifiManager?.isWifiEnabled == true) {
  100. wifiManager?.startScan()
  101. }
  102. } else {
  103. requestSinglePermissionLauncher.launch(requestPermissionName)
  104. }
  105. }
  106. binding.rvWifiInfo.adapter = wifiAdapter
  107. registerReceiver(scanResultReceiver, IntentFilter().apply {
  108. addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
  109. })
  110. }
  111. override fun onDestroy() {
  112. super.onDestroy()
  113. unregisterReceiver(scanResultReceiver)
  114. }
  115. }

以上就是Android扫描WIFI权限功能怎么实现的详细内容,更多关于Android扫描WIFI权限功能怎么实现的资料请关注九品源码其它相关文章!