簡體   English   中英

WiFiManager API 在 Android Q, R

[英]WiFiManager API in Android Q, R

我正在編寫一個示例應用程序,它正在掃描可用的 wifis 並以編程方式連接到它們

對於該建議,我使用的是WiFiManager ,但最近 Google 棄用了大多數允許掃描 WiFi 並以編程方式連接到它們的方法。 是的,從谷歌的角度來看,不允許任何人嘗試以編程方式連接到任何 WiFi 似乎是合乎邏輯的。 但我的問題將隨之而來

  • 是否還有辦法掃描可用的 WiFi-s
  • 有沒有辦法連接到公共 WiFi
  • 有沒有辦法以編程方式連接到私人 WiFi,或者如果沒有,是否有辦法建議用戶連接到私人 WiFi,所以用戶可以輸入密碼

在新的 API 中,我找到了一種建議用戶連接到 WiFi 的方法

wifiManager.addNetworkSuggestions(listOf(WifiNetworkSuggestion
                   .Builder()
                   .setSsid("testWiFi")
                   .setWpa2Passphrase("test1234")
                   .build()))

但這確實無法預測,當我第一次運行我的所有並調用此方法時,在 Android Q 上顯示通知,在 Android R 上顯示通知時詢問用戶是否允許以某種方式連接到 WiFi 對話框到 WiFi 但之后為另一個 WiFi 調用相同的 function 什么也不做,應用程序不再顯示 ant 通知或對話框(這是一個錯誤?)

我也試過requestNetwoerk方法

val specifier = WifiNetworkSpecifier
        .Builder()
        .setSsid("testWiFi")
        .setBssid(MacAddress.fromString("testWiFiMac"))
        .build()

val request = NetworkRequest
        .Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(specifier)
        .build()

connectivityManager.requestNetwork(request, networkCallback)

但在這種情況下,是否可以連接到受密碼保護的 WiFi,以及如果可以,如何連接還不是很清楚。

因此,如果有一些示例或解釋,請告訴我。

即使開始掃描已被棄用,谷歌仍然建議使用它。

這里的三個步驟是:

  1. 為 SCAN_RESULTS_AVAILABLE_ACTION 注冊一個廣播接收器。
  2. 使用 WifiManager.startScan() 請求掃描
  3. 使用 WifiManager.getScanResults() 獲取掃描結果。 請注意,如果您在接收廣播結果之前使用這些掃描結果,則這些結果可能比以前的掃描結果要舊一些。

示例代碼可能如下所示:

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

val wifiScanReceiver = object : BroadcastReceiver() {

  override fun onReceive(context: Context, intent: Intent) {
    val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
    if (success) {
      scanSuccess()
    } else {
      scanFailure()
    }
  }
}

val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)

val success = wifiManager.startScan()
if (!success) {
  // scan failure handling
  scanFailure()
}

....

private fun scanSuccess() {
  val results = wifiManager.scanResults
  ... use new scan results ...
}

private fun scanFailure() {
  // handle failure: new scan did NOT succeed
  // consider using old scan results: these are the OLD results!
  val results = wifiManager.scanResults
  ... potentially use older scan results ...
}

對於在 Android Q 或更高版本上運行的設備,正確連接到不作為對等網絡的公共或私有 wifi 的唯一方法是使用您在問題中已經顯示的 NetworkSuggestionAPI。

有時您看不到網絡建議的原因如下:“如果用戶在連接到某個網絡建議時使用 Wi-Fi 選擇器明確斷開與它的連接,則該網絡將在 24 小時內被忽略。在在此期間,即使應用程序刪除並重新添加與網絡對應的網絡建議,該網絡也不會被考慮自動連接。”,引自谷歌文檔網站。

有關 wifi 掃描的更多信息,請查看官方文檔: https://developer.android.com/guide/topics/connectivity/wifi-scan#kotlin

關於 WifiNetworkSuggestion API 的更多信息可以在這里找到: https://developer.android.com/guide/topics/connectivity/wifi-suggest

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM