Android API 连接到 Wifi 网络

Hac*_*cki 2 android wifi android-wifi android-developer-api

我完全迷失在 WiFi API 的版本中。\n我想以编程方式连接到配置的 WiFi 网络。\n如本问题所述:\n 以编程方式连接到 Android 的 WiFi 网络

\n

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

\n

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

\n

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

\n

问候 J\xc3\xbcrgen

\n

小智 6

从Android Q开始,连接Wifi网络发生了很大变化。

\n

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

\n

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

\n
1. WifiNetworkSpecifier\n
Run Code Online (Sandbox Code Playgroud)\n

WifiUtil 库中的代码示例

\n
WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder()\n            .setSsid(scanResult.SSID)\n            .setBssid(MacAddress.fromString(scanResult.BSSID));\n\n    final String security = ConfigSecurities.getSecurity(scanResult);\n\n    ConfigSecurities.setupWifiNetworkSpecifierSecurities(wifiNetworkSpecifierBuilder, security, password);\n\n\n    NetworkRequest networkRequest = new NetworkRequest.Builder()\n            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)\n            .setNetworkSpecifier(wifiNetworkSpecifierBuilder.build())\n            .build();\n\n    // not sure, if this is needed\n    if (networkCallback != null) {\n        connectivityManager.unregisterNetworkCallback(networkCallback);\n    }\n\n    networkCallback = new ConnectivityManager.NetworkCallback() {\n        @Override\n        public void onAvailable(@NonNull Network network) {\n            super.onAvailable(network);\n\n            wifiLog("AndroidQ+ connected to wifi ");\n\n            // bind so all api calls are performed over this new network\n            connectivityManager.bindProcessToNetwork(network);\n        }\n\n        @Override\n        public void onUnavailable() {\n            super.onUnavailable();\n\n            wifiLog("AndroidQ+ could not connect to wifi");\n        }\n    };\n\n    connectivityManager.requestNetwork(networkRequest, networkCallback);\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
2. WifiNetworkSuggestion \n
Run Code Online (Sandbox Code Playgroud)\n

来自developer.android.com 的代码示例

\n
final WifiNetworkSuggestion suggestion1 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test111111")\n  .setIsAppInteractionRequired(true) // Optional (Needs location permission)\n  .build();\n\nfinal WifiNetworkSuggestion suggestion2 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test222222")\n  .setWpa2Passphrase("test123456")\n  .setIsAppInteractionRequired(true) // Optional (Needs location permission)\n  .build();\n\nfinal WifiNetworkSuggestion suggestion3 =\n  new WifiNetworkSuggestion.Builder()\n  .setSsid("test333333")\n  .setWpa3Passphrase("test6789")\n  .setIsAppInteractionRequired(true) // Optional (Needs location permission)\n  .build();\n\nfinal PasspointConfiguration passpointConfig = new PasspointConfiguration();\n// configure passpointConfig to include a valid Passpoint configuration\n\nfinal WifiNetworkSuggestion suggestion4 =\n  new WifiNetworkSuggestion.Builder()\n  .setPasspointConfig(passpointConfig)\n  .setIsAppInteractionRequired(true) // Optional (Needs location permission)\n  .build();\n\nfinal List<WifiNetworkSuggestion> suggestionsList =\n  new ArrayList<WifiNetworkSuggestion> {{\n    add(suggestion1);\n    add(suggestion2);\n    add(suggestion3);\n    add(suggestion4);\n  }};\n\nfinal WifiManager wifiManager =\n  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\n\nfinal int status = wifiManager.addNetworkSuggestions(suggestionsList);\nif (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {\n// do error handling here\xe2\x80\xa6\n}\n\n// Optional (Wait for post connection broadcast to one of your suggestions)\nfinal IntentFilter intentFilter =\n  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);\n\nfinal BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {\n  @Override\n  public void onReceive(Context context, Intent intent) {\n    if (!intent.getAction().equals(\n      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {\n      return;\n    }\n    // do post connect processing here...\n  }\n};\ncontext.registerReceiver(broadcastReceiver, intentFilter);\n\n
Run Code Online (Sandbox Code Playgroud)\n

我对上述实现的观察是,当您调用它时,它wifiManager.addNetworkSuggestions会返回成功并向用户显示连接通知。如果用户接受,设备将连接到 WiFi 网络,其他应用程序可以使用互联网。但如果用户断开网络并再次调用wifiManager.addNetworkSuggestions,则会返回 WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE错误。

\n

看起来这个 API 只是提供了设备可以自动连接的网络的建议列表。但连接将由操作系统决定。

\n

但如果您确实需要一个解决方案,可以使用 Android Source 中的默认 Wifi QR 码扫描仪来检测 QR 码方案 Zxing 和 DPP。

\n

这是一个代码示例:

\n
@Override\nprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {\n    super.onActivityResult(requestCode, resultCode, data);\n\n    if(requestCode == REQUEST_CODE_WIFI_QR_SCANNER && resultCode == RESULT_OK)\n    {\n        //WIFI Connection is Successful\n    }\n    else\n    {\n        //.......\n    }\n}\n\n@RequiresApi(api = Build.VERSION_CODES.Q)\nprivate void startWifiQRCodeScanner(Context context)\n{\n    final String INTENT_ACTION_WIFI_QR_SCANNER = "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER";\n    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);\n\n    if(wifiManager.isEasyConnectSupported())\n    {\n        final Intent intent = new Intent(INTENT_ACTION_WIFI_QR_SCANNER);\n        startActivityForResult(intent, REQUEST_CODE_WIFI_QR_SCANNER);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n