Como criar e ler programaticamente WEP/EAP WiFi configurations
no Android?
Tenho visto várias pessoas lutando com essa mesma questão em vários fóruns e em toda a comunidade. Eu sei que isso não é tão direto (especialmente EAP) de descobrir porque quando eu queria conseguir o mesmo, eu também me esforcei bastante. Bem, todo o trabalho árduo de análise de código e pesquisa de várias implementações na internet feito com eu estava finalmente capaz de atingir o objetivo. Todo o crédito vai para vários projetos de código aberto e seus desenvolvedores.
Eu gostaria de compartilhar esse conhecimento com todos, já que o SO encoraja isso: "Também é perfeitamente normal fazer e responder sua própria pergunta, desde que você finja que está no Jeopardy: expresse na forma de uma pergunta."
Parte 1: Criando uma configuração WEP WiFi programaticamente.
Parte 2: Leia uma configuração WEP WiFi de forma programática.
Parte 3: Leia uma configuração WiFi EAP programaticamente.
Parte 4: Salvar uma configuração WiFi EAP programaticamente.
fonte
Respostas:
Parte 1: Criando uma configuração WEP WiFi programaticamente
Isso é muito simples, WifiConfiguration expõe a interface para criar o mesmo. Aqui está o código de exemplo:
Seguindo as permissões necessárias em AndroidManifest.xml
Parte 2: Leia
novamente uma configuração WEP WiFi de forma programática simples. Aqui está o código de exemplo:
Parte 3: Leia uma configuração WiFi EAP programaticamente
Agora, isso é complicado. Você pode encontrar o código que salva uma configuração WiFi EAP por meio da interface de usuário do Android vanilla em WifiDialog.java . Bem fácil. Podemos usar o mesmo código em nosso aplicativo, bem, NÃO! Se acontecer de você tentar isso, você receberá erros dizendo não consegue encontrar os símbolos
eap
,phase
,client_cert
e assim por diante. Uma pequena investigação detalhada nos mostra EnterpriseFieldis private
dentro daWiFiConfiguration
classe e todos os símbolos que não conseguimos encontrar são do tipoEnterpriseField
. Bem, nós encontramos um obstáculo. Precisamos desses campos para ler / salvar uma configuração EAP, mas não temos acesso programático a eles!Java Reflection API
para o resgate Bem, eu não sou um especialista em Java, então não entrarei em detalhes da API do Reflection como tal e você pode pesquisar tutoriais no Google ou obter mais informações aqui . Para mantê-lo curto e agradável, o Reflection API permite que você inspecione classes, interfaces, campos e métodos em tempo de execução, sem saber os nomes das classes, métodos etc. em tempo de compilação. Também é possível instanciar novos objetos, invocar métodos e obter / definir valores de campo usando reflexão. E, o mais importante, Reflexão pode ajudá-lo a acessar membros de dados privados dentro de uma classe Bem, é disso que precisamos, não é? :)Vamos verificar o exemplo de código agora que mostra como ler uma configuração EAP WiFi usando o Reflection Api. Como um bônus, o snippet irá registrar a configuração em um arquivo e salvá-lo no cartão SD ... bem esperto ..eh;) Um pouco de visão geral do Reflection Api e tenho certeza de que entender o código abaixo é fácil.
Este é o código para criar um arquivo de log no cartão SD antes de chamar a
readEapConfig()
função.Agora, a
readEapConfig()
própria função:fonte
Ahh eu fiquei sem espaço de edição, adicionando a parte restante aqui.
Parte 4: Salvar uma configuração EAP WiFi programaticamente
Se você já leu a parte 3, você já entende a mágica do Reflection que funciona aqui. Se você está pulando diretamente para esta seção, leia a introdução antes do trecho de código na parte 3 e você estará pronto para percorrer o código aqui !
Bem, é isso! E espero que isso ajude algum desenvolvedor perdido, em algum lugar, algum dia :)
fonte
Field wcAdhoc = WifiConfiguration.class.getField("adhocSSID"); Field wcAdhocFreq = WifiConfiguration.class.getField("frequency");
. Esses membros não estão em WifiConfiguration.java. O código está me dando uma exceçãojava.lang.NoSuchFieldException: adhocSSID
. Por favor ajude.wcefPrivateKey.get(selectedConfig)
lança umNullPointerException
. Alguma sorte de mais alguém?O Android adicionou uma API ao JellyBean 4.3. Você deve usar esta opção se quiser configurar WIFI na API 18:
http://developer.android.com/reference/android/net/wifi/WifiEnterpriseConfig.html
fonte
A Parte 4 me iniciou no caminho certo! No entanto, eu queria criar uma configuração TTLS em vez de TLS, aqui está como eu fiz!
Espero que isso ajude alguém. @Android learner Removi a parte sobre adHocFrequency e SSID, pois eles estavam causando travamentos, mas meus resultados ainda eram bons sem eles.
fonte
As chaves WEP são mascaradas, portanto não é possível lê-las com o código mencionado
Existe alguma maneira de resolver isso da mesma forma que a solução EAP? Com reflexão?
fonte