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)
在WifiManager
Android 10 中已弃用,并将返回 -1 作为网络 ID。
从 Android Q 开始,建议使用两个类用于 Wifi 连接。但它们每个都有自己的优点和缺点。
\n1. WifiNetworkSpecifier\n
Run Code Online (Sandbox Code Playgroud)\nWifiUtil 库中的代码示例
\nWifiNetworkSpecifier.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 网络的互联网
\n2. WifiNetworkSuggestion \n
Run Code Online (Sandbox Code Playgroud)\n来自developer.android.com 的代码示例
\nfinal 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
错误。
看起来这个 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
归档时间: |
|
查看次数: |
6305 次 |
最近记录: |