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

标签 android ssl android-permissions android-9.0-pie android-security

我有一个应用程序可以在 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/

相关文章:

android - 在用户响应之前对自定义内核调用 onRequestPermissionsResult 调用 requestPermissions 两次

android - 找不到字段的 setter - 将 Kotlin 与 Room 数据库结合使用

java - 我怎样才能抑制匿名 new runnable() 可以用 lambda 代替

Android - 使用动画的神器

azure - 具有 Azure 身份验证的私有(private) Web 服务器的 SSL 证书

curl: (60) Peer's certificate issuer 已被标记为不被用户信任

Android:如何获得可移动SD卡的永久写入权限?

未授予 Android 权限

c# - Xamarin - 将 ESRI MapView 动态添加到 FrameLayout

security - SSL:为什么 Chrome 会报告混合内容? (德鲁帕尔 6)