Eu tinha relatórios de usuários com Android 8 que meu aplicativo (que usa back-end feed) não mostra conteúdo. Após a investigação, encontrei a seguinte Exceção acontecendo no Android 8:
08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
(I'removi o nome do pacote, URL e outros identificadores possíveis)
No Android 7 e em baixo tudo funciona, eu não defino android:usesCleartextTraffic
no Manifesto (e defini-lo como true
não ajuda, esse é o valor padrão de qualquer forma), nem utilizo as informações de segurança da rede. Se eu chamar NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()
, ele retorna false
para o Android 8, true
para a versão mais antiga, utilizando o mesmo arquivo apk.
Eu tentei encontrar alguma menção a isso no Google info sobre o Android O, mas sem sucesso.
De acordo com Configuração de segurança de rede -
A partir do Android 9 (API nível 28), o suporte a cleartext está desativado por defeito.
Dê uma olhada também em - https://koz.io/android-m-and-the-war-on-cleartext-traffic/
**Opção 1 -***
Criar arquivo res/xml/network_security_config.xml -
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">domain.com (to be adjusted)</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
**Opção 2 -***
android:usesCleartextTraffic Doc
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Também como @david.s' answer apontou android:targetSandboxVersion
pode ser um problema também -
De acordo com Manifest Docs -
android:targetSandboxVersion
A caixa de areia alvo para este aplicativo a ser usado. Quanto mais alta for a versão sandbox número, quanto maior o nível de segurança. O seu valor padrão é 1; você A definição deste atributo para 2 muda a aplicação para uma caixa de areia SELinux diferente. As seguintes restrições aplicam-se a uma caixa de areia nível 2:
- O valor padrão de
usesCleartextTraffic
na Configuração de Segurança de Rede é falso.- O compartilhamento de Uid não é permitido.
**Então a opção 3 -***
Se você tem android:targetSandboxVersion
em <manifest>
, então reduza para 1
.
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
No AndroidManifest eu encontrei este parâmetro:
android:networkSecurityConfig="@xml/network_security_config"
e @xml/network_security_config é definido em network_security_config.xml como:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--Set application-wide security config using base-config tag.-->
<base-config cleartextTrafficPermitted="false"/>
</network-security-config>
apenas mudei o cleartextTrafficPermitted para true
Está bem, já descobri isto. É devido ao parâmetro Manifesto android:targetSandboxVersion="2"
, que eu adicionei porque nós também temos a versão Instant App - ele deve ter certeza de que uma vez que o usuário atualize do Instant App para o app normal, ele não vai perder seus dados com a transferência. No entanto, como a descrição vaga sugere:
Especifica a caixa de areia alvo que este aplicativo quer usar. As versões sanbox superiores terão níveis de segurança cada vez maiores.
O valor padrão deste atributo é 1.
Obviamente também acrescenta um novo nível de política de segurança, pelo menos no Android 8.