1. 程式人生 > 程式設計 >Android10自動連線WiFi問題的解決

Android10自動連線WiFi問題的解決

說明:

本文主要說明掃碼之後自動連線WiFi的一些處理,掃碼的流程相對簡單,網上教程也比較多,對於目前Android各個版本也沒有太多變化。

問題描述:

最近在做專案的時候,發現以前的專案有掃描二維碼自動連線WiFi的功能,裝置改了生成二維碼的方式,然後發現手機無法自動連線WiFi了。

問題原因:

經過程式碼除錯發現:(我都是真機除錯)

wifiManager.addNetwork(WifiConfiguration);

在新增WiFi的時候,這行程式碼始終返回-1,換用同事手機竟然神奇的可以連線,然後一臉矇蔽,裂開了,不怕有問題,就怕有的有問題,有的沒問題。

問題解決:

區別:我測試手機小米10androidQ(andorid 10)的系統,同事手機榮耀androidP的系統,大膽猜測是不是android 10又搞了什麼奇怪的東西

根因:皇天不負有心人,上程式碼:

/**
   * Add a new network description to the set of configured networks.
   * The {@code networkId} field of the supplied configuration object
   * is ignored.
   * <p/>
   * The new network will be marked DISABLED by default. To enable it,* called {@link #enableNetwork}.
   *
   * @param config the set of variables that describe the configuration,*      contained in a {@link WifiConfiguration} object.
   *      If the {@link WifiConfiguration} has an Http Proxy set
   *      the calling app must be System,or be provisioned as the Profile or Device Owner.
   * @return the ID of the newly created network description. This is used in
   *     other operations to specified the network to be acted upon.
   *     Returns {@code -1} on failure.
   *
   * @deprecated
   * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
   * mechanism to trigger connection to a Wi-Fi network.
   * b) See {@link #addNetworkSuggestions(List)},* {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
   * when auto-connecting to wifi.
   * Compatibility Note: For applications targeting
   * {@link android.os.Build.VERSION_CODES#Q} or above,this API will always return {@code -1}.
   */
  @Deprecated
  public int addNetwork(WifiConfiguration config) {
    if (config == null) {
      return -1;
    }
    config.networkId = -1;
    return addOrUpdateNetwork(config);
  }

這是WifiManager.class中addNetwork方法的描述,注意註釋中最後一行

{@link android.os.Build.VERSION_CODES#Q} or above,this API will always return {@code -1}.

androidQ或者更高的版本,這個方法始終返回-1,至此問題原因分析完畢,接下來開始解決:官網一頓操作:Android 10的新方案如下連線:https://developer.android.google.cn/guide/topics/connectivity/wifi-bootstrap

程式碼如下:

public void test()
  {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
    {
      NetworkSpecifier specifier =
          new WifiNetworkSpecifier.Builder()
              .setSsidPattern(new PatternMatcher("此處WiFi名稱",PatternMatcher.PATTERN_PREFIX))
              .setWpa2Passphrase("此處WiFi密碼")
              .build();
 
      NetworkRequest request =
          new NetworkRequest.Builder()
              .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
              .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
              .setNetworkSpecifier(specifier)
              .build();
 
      ConnectivityManager connectivityManager = (ConnectivityManager)
          context.getSystemService(Context.CONNECTIVITY_SERVICE);
 
      ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
          // do success processing here..
        }
 
        @Override
        public void onUnavailable() {
          // do failure processing here..
        }
      };
      connectivityManager.requestNetwork(request,networkCallback);
      // Release the request when done.
      // connectivityManager.unregisterNetworkCallback(networkCallback);
    }
  }

注:我用的是WPA的加密模式,親測可用。至此完結,撒花。

到此這篇關於Android10自動連線WiFi問題的解決的文章就介紹到這了,更多相關Android10自動連線WiFi內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!