Android Q,以编程方式连接到不同的 WiFi AP 以上网

标签 android android-wifi android-developer-api android-connectivitymanager android-10.0

与 Android Q 一样,一些 WiFi API 受到限制。我正在尝试使用备用 API 连接到不同的 Wifi AP 以上网。

下面是我的代码:

    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

    NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
    networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);

    NetworkRequest nr = networkRequestBuilder1.build();
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.requestNetwork(nr, callback);

这允许我连接,但 Internet 被禁用。这是按照 Android 文档中的定义工作的。

我尝试的替代方法如下:

    WifiNetworkSuggestion.Builder wifiNetworkSuggestionBuilder1 = new WifiNetworkSuggestion.Builder();
    wifiNetworkSuggestionBuilder1.setSsid("wifi-ap-ssid");
    wifiNetworkSuggestionBuilder1.setWpa2Passphrase("wifi-ap-password");
    WifiNetworkSuggestion wifiNetworkSuggestion = wifiNetworkSuggestionBuilder1.build();
    List<WifiNetworkSuggestion> list = new ArrayList<>();
    list.add(wifiNetworkSuggestion);
    wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    wifiManager.removeNetworkSuggestions(new ArrayList<WifiNetworkSuggestion>());
    wifiManager.addNetworkSuggestions(list);

在 list 中声明权限:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

使用它不会改变任何行为。

请告知成功连接到具有互联网功能的不同 Wifi AP 的 API 序列。

最佳答案

尝试在 onAvailable() 回调中调用 bindProcessToNetwork() 以重新获得网络连接,对我来说效果很好。

连接到网络:

    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid("wifi-ap-ssid");
    builder.setWpa2Passphrase("wifi-ap-password");

    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

    NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
    networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);

    NetworkRequest nr = networkRequestBuilder1.build();
    ConnectivityManager cm = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ConnectivityManager.NetworkCallback networkCallback = new 
        ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            Log.d(TAG, "onAvailable:" + network);
            cm.bindProcessToNetwork(network);
        }
    });
    cm.requestNetwork(nr, networkCallback);

断开绑定(bind)网络:

cm.unregisterNetworkCallback(networkCallback);

关于Android Q,以编程方式连接到不同的 WiFi AP 以上网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56831023/

相关文章:

java - 如何使用 Jsoup 选择没有 ID 或属性的 div?

Android:FaceDetector 不工作。 findface 始终检测零面;

Android Studio 上的 Android Tesseract OCR

android - 为什么 setWifiEnabled 为 CHANGE_NETWORK_STATE 权限抛出 SecurityException?

Android Auto 自定义应用程序 - 官方

4.1 API 上的 AndroidKeystore

android - 小部件双击

java - 如何自动连接指定SSID的WiFi?

android - 如何在 Android 中强制通过 Wi-Fi 而不是蜂窝网络进行 HTTP 连接?

android - 如何从子 Activity 而不是主 Activity 使用 facebook 登录