简单的发布请求在 android 9 中不起作用

use*_*565 1 ssl android android-permissions android-security android-9.0-pie

我有一个在下面运行良好的应用程序Android9 phones。最近我开始测试我的应用程序android 9并面临一个奇怪的问题,即简单的 https/http 后调用不起作用,并且 library( com.loopj.android) 给出了一个无法连接的异常。我知道有一个与网络相关的变化,我尝试了我在互联网上找到的所有东西,但仍然没有运气。这是我的配置:

清单.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>
Run Code Online (Sandbox Code Playgroud)

res/xml 中的network_security_config.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>
Run Code Online (Sandbox Code Playgroud)

我正在使用正确的密钥库签署应用程序: build.gradle:

signingConfigs {
        release {
            storeFile file("../myApp-release.keystore")
            storePassword "abcd1234"
            keyAlias "myApp-release"
            keyPassword "abcd1234"
        }
    }
Run Code Online (Sandbox Code Playgroud)

还尝试为 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) {

        }
Run Code Online (Sandbox Code Playgroud)

还试图用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
Run Code Online (Sandbox Code Playgroud)

我已经植根电话并在没有活动但只有意图服务的应用程序中运行此代码。我做了一些测试并发现如果我通过活动运行我的 HTTP 请求(在同一应用程序中创建新的活动用于测试目的),然后发送意图到这个 InteneService 也开始工作,但在应用程序安装和发送时不调用任何活动IntentService 调用失败。我知道谷歌在 Android 9 中添加了更多限制,我不知道我现在缺少哪一个。有人可以给我一个线索。

Kau*_*hal 5

您必须在 AndroidManifes.xml 文件中的应用程序标记上添加 android:usesCleartextTraffic="true" 属性。

还要加上这个。

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />
Run Code Online (Sandbox Code Playgroud)

机器人:使用CleartextTraffic =“真”

在清单文件中,如下所示。

<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">
Run Code Online (Sandbox Code Playgroud)

查看这个官方博客,了解为什么会发生这种情况,我们必须添加清单文件。