我有一个应用程序可以在 Android9 手机
以下正常运行。最近我开始在 android 9
上测试我的应用程序并面临一个奇怪的问题,即简单的 https/http post-call 无法正常工作,而 library(com.loopj.android
) 给出了一个无法连接的异常。我知道有一个与网络相关的变化,我尝试了我在互联网上找到的所有东西,但仍然没有运气。这是我的配置:
list .xml:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
tools:targetApi="28"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
</application>
network_security_config.xml 在 res/xml 中:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">my-backend.hostname.dk</domain>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</domain-config>
</network-security-config>
我正在使用适当的 keystore 对应用程序进行签名: build.gradle:
signingConfigs {
release {
storeFile file("../myApp-release.keystore")
storePassword "abcd1234"
keyAlias "myApp-release"
keyPassword "abcd1234"
}
}
还尝试为 httpclient 使用适当的 SSLFactory:
AsyncHttpClient client = new AsyncHttpClient();
try {
KeyStore trustStore = MySSLSocketFactory.getKeystore();
MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
// MyCustomSSLFactory socketFactory = new MyCustomSSLFactory(trustStore);
client.setSSLSocketFactory(sf);
client.setTimeout(600000);
client.setConnectTimeout(10000);
} catch (Exception e) {
}
还尝试使用此 post 中提到的 SSL但对我来说没有任何用处,并且每当我的程序尝试调用后端 REST API 时仍然会出现异常。异常:
07-12 13:49:08.435 5111-5129/com.myapp.cherinstall W/System.err: java.net.SocketTimeoutException: failed to connect to my-backend.hostname.dk/192.168.4.24 (port 8182) from /192.168.3.246 (port 48880) after 10000ms
我已 root 手机并在一个没有 Activity 但只有 Intent 服务的应用程序中运行此代码。我做了一些测试,发现如果我通过 Activity 运行我的 HTTP 请求(为了测试目的在同一个应用程序中创建新的 Activity )只运行一次,那么向这个 InteneService 发送 Intent 也会开始工作,但是在应用程序安装和发送时不调用任何 Activity IntentService 调用失败。我知道 Google 在 Android 9 中添加了更多限制,我不知道我现在缺少哪一个。有人可以给我一个线索吗?
最佳答案
您必须在 AndroidManifes.xml 文件中的应用程序标签上添加 android:usesCleartextTraffic="true"属性。
还要加上这个。
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
设置
android:usesCleartextTraffic="true"
在 list 文件中,如下所示。
<application
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:targetApi="m">
查看此官方博客了解为什么会发生这种情况,我们必须添加 list 文件。
关于android - 简单的发布请求在 android 9 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57007230/