用于连接到Wifi网络的Android API

问题描述

我对WiFi API的版本完全迷失了。 我想以编程方式连接到已配置的WiFi网络。 正如在这个问题中所述: Connect to wifi network Android programmatically

我在Android 10上进行开发,希望编写与旧版Android版本兼容的代码。

在我的android 10上,描述的代码不起作用。 在Android 10上实现该功能需要什么代码?

如何编写也可以在其他Android 9手机上运行的应用程序?

关于于尔根(Jürgen)

解决方法

这是从Android 6(API级别23)开始工作的解决方案

ctrl+a
,

从Android Q,连接到Wifi网络有很多变化。

首先,您正在使用的代码或提到的@matdev使用public int addNetwork (WifiConfiguration config)中的API WifiManager的API 1. WifiNetworkSpecifier 在Android 10中已弃用,并将返回-1作为networkID。

从Android Q开始,建议使用两个类进行Wifi连接。但是它们每个都有自己的优点和缺点。

WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder()
            .setSsid(scanResult.SSID)
            .setBssid(MacAddress.fromString(scanResult.BSSID));

    final String security = ConfigSecurities.getSecurity(scanResult);

    ConfigSecurities.setupWifiNetworkSpecifierSecurities(wifiNetworkSpecifierBuilder,security,password);


    NetworkRequest networkRequest = new NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .setNetworkSpecifier(wifiNetworkSpecifierBuilder.build())
            .build();

    // not sure,if this is needed
    if (networkCallback != null) {
        connectivityManager.unregisterNetworkCallback(networkCallback);
    }

    networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);

            wifiLog("AndroidQ+ connected to wifi ");

            // bind so all api calls are performed over this new network
            connectivityManager.bindProcessToNetwork(network);
        }

        @Override
        public void onUnavailable() {
            super.onUnavailable();

            wifiLog("AndroidQ+ could not connect to wifi");
        }
    };

    connectivityManager.requestNetwork(networkRequest,networkCallback);

WifiUtil库中的代码示例

2. WifiNetworkSuggestion 

我对该实现的观察是-它更像是P2P通信,并且此时来自同一设备的其他应用程序无法使用连接的WiFi网络的互联网

final WifiNetworkSuggestion suggestion1 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test111111")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion2 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test222222")
  .setWpa2Passphrase("test123456")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion3 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test333333")
  .setWpa3Passphrase("test6789")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final PasspointConfiguration passpointConfig = new PasspointConfiguration();
// configure passpointConfig to include a valid Passpoint configuration

final WifiNetworkSuggestion suggestion4 =
  new WifiNetworkSuggestion.Builder()
  .setPasspointConfig(passpointConfig)
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final List<WifiNetworkSuggestion> suggestionsList =
  new ArrayList<WifiNetworkSuggestion> {{
    add(suggestion1);
    add(suggestion2);
    add(suggestion3);
    add(suggestion4);
  }};

final WifiManager wifiManager =
  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
}

// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context,Intent intent) {
    if (!intent.getAction().equals(
      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
      return;
    }
    // do post connect processing here...
  }
};
context.registerReceiver(broadcastReceiver,intentFilter);

developer.android.com中的代码示例

wifiManager.addNetworkSuggestions

我对上述实现的观察是,当您调用wifiManager.addNetworkSuggestions时,它将返回成功并向用户显示连接通知。如果用户接受,则设备将连接到WiFi网络,其他应用程序可以连接互联网。但是,如果用户断开网络连接,而您再次致电 WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE,它将返回@Override protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) { super.onActivityResult(requestCode,resultCode,data); if(requestCode == REQUEST_CODE_WIFI_QR_SCANNER && resultCode == RESULT_OK) { //WIFI Connection is Successful } else { //....... } } @RequiresApi(api = Build.VERSION_CODES.Q) private void startWifiQRCodeScanner(Context context) { final String INTENT_ACTION_WIFI_QR_SCANNER = "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"; WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if(wifiManager.isEasyConnectSupported()) { final Intent intent = new Intent(INTENT_ACTION_WIFI_QR_SCANNER); startActivityForResult(intent,REQUEST_CODE_WIFI_QR_SCANNER); } } 错误。

该API似乎仅提供设备可以自动连接的网络的建议列表。但是连接将由操作系统决定。

但是,如果您确实需要解决方案,可以使用未记录的方式使用Android Source中的默认Wifi QR码扫描仪,该方法可以同时检测QR Code方案Zxing和DPP。

这是一个代码示例:

Try below code and indicate your directory like below

async function fetchText() {
    let response = await fetch('../demo.txt');

    console.log(response.status); // 200
    console.log(response.statusText); // OK

    if (response.status === 200) {
        let data = await response.text();
        console.log(data);
        // handle data
    }
}

fetchText();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...