Android 7设备WifiConfiguration不生效问题求助(附代码)
问题:Android 7设备上无法创建并连接802.1x EAP WiFi配置
我开发了一款用于创建WiFi接口并连接支付设备的应用,代码在Android 8(A920 Pro)设备上可正常运行,但在Android 7(A920)设备上无法工作。所有WiFi配置逻辑由SharedViewModel处理,UI部分由MainActivity实现。
核心逻辑代码(SharedViewModel)
@HiltViewModel class SharedViewModel @Inject constructor(@ApplicationContext context: Context) : ViewModel() { private val wifiManager: WifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager private val _isLoading: MutableStateFlow<Boolean> = MutableStateFlow(false) val isLoading: StateFlow<Boolean> = _isLoading.asStateFlow() fun launchWifiConfiguration(context: Context) { viewModelScope.launch(Dispatchers.IO) { _isLoading.emit(true) if (!wifiManager.isWifiEnabled) { wifiManager.isWifiEnabled = true } if (ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@launch } val wifiConfiguration = createWifiConfiguration() try { connectWifi( context = context, wifiConfiguration = wifiConfiguration ).also { _isLoading.emit(false) } } catch (e: Exception) { _isLoading.emit(false) } } } private fun createWifiConfiguration(): WifiConfiguration { /** * Set the following wifi params: * Seguridad: 802.1x EAP * Método EAP: EAP PEAP * Autenticación fase 2: MSCHAPv2 * Certificado CA: Sin certificado * Identidad: *********** * Identidad anónima: Nada * Contraseña: ****** * */ val wifiEnterpriseConfig = WifiEnterpriseConfig() val wifiConfiguration = WifiConfiguration() wifiConfiguration.status = WifiConfiguration.Status.ENABLED wifiEnterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP wifiEnterpriseConfig.phase2Method = WifiEnterpriseConfig.Phase2.MSCHAPV2 wifiEnterpriseConfig.caCertificate = null wifiEnterpriseConfig.anonymousIdentity = null wifiEnterpriseConfig.identity = "\""+BuildConfig.WIFI_USER +"\"" wifiEnterpriseConfig.password = "\""+BuildConfig.WIFI_PASS +"\"" wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.LEAP) wifiConfiguration.enterpriseConfig = wifiEnterpriseConfig wifiConfiguration.SSID = "\""+BuildConfig.WIFI_SSID +"\"" wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP) wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X) wifiConfiguration.preSharedKey ="\""+BuildConfig.WIFI_PASS+"\"" wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP) wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP) wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN) wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA) return wifiConfiguration } private fun connectWifi( context: Context, wifiConfiguration: WifiConfiguration, ) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return } if(!wifiManager.isWifiEnabled){ wifiManager.isWifiEnabled = true } //add the network val ssid = wifiManager.addNetwork( wifiConfiguration ) //Enable all the interface wifiManager.configuredNetworks.map { it.status = WifiConfiguration.Status.ENABLED } wifiManager.disconnect() wifiManager.enableNetwork(ssid, true) // this initiates the connection wifiManager.reconnect() } fun getNetworkId(context: Context, ssid: String): Int { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return -1 } val configurations = wifiManager.configuredNetworks for (config in configurations) { if (config.SSID != null && config.SSID.equals(ssid, true)) { return config.networkId } } return -1 } }
UI代码(MainActivity)
@AndroidEntryPoint class MainActivity : ComponentActivity() { private val viewModel: SharedViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setUI() processWifiConfiguration(applicationContext) } private fun processWifiConfiguration(context: Context) { try { viewModel.launchWifiConfiguration(context = context) }catch (e:NullPointerException){ e.printStackTrace() } } private fun setUI() { setContent { val viewModel: SharedViewModel = hiltViewModel() val isLoading by viewModel.isLoading.collectAsState() val context = LocalContext.current WifiCepsaManagerTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { if(isLoading){ CenterLoadingText(applicationContext.getString(R.string.wait)) }else{ //Finnish activity context.startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) this.finish() } } } } } } @Composable fun CenterLoadingText(name: String) { Box( contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize() ) { CircularProgressIndicator() Text( text = name, textAlign = TextAlign.Center ) } }
已尝试的解决方案
- 移除
allowedPairwiseCiphers等参数 - 设置与家用WiFi相同的
allowedProtocols - 移除业务必需的
allowedKeyManagement参数(不符合业务要求)
经过查阅Android WiFi管理相关资料,判断问题在于Android 7不接受当前的WifiConfiguration对象。目前可选方案所剩无几,恳请提供帮助。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

