简单的帖子请求在android 9中不起作用

时间:2019-07-12 12:41:15

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

我有一个可以在Android9 phones以下运行的应用程序。最近,我开始在android 9上测试我的应用程序,并遇到一个奇怪的问题,即简单的https / http帖子调用无法正常工作,并且库(com.loopj.android)给出了无法连接的异常。我知道与网络有关的变化,我尝试了所有我在互联网上找到的东西,但还是没有运气。这是我的配置:

Manifest.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"
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>

我正在使用正确的密钥库对应用程序进行签名: 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

我已经扎根手机并在没有活动但只有intentService的App中运行此代码。我做了一些测试,发现如果我只通过一次活动运行我的http请求(在同一应用程序中创建新的活动以用于测试目的),则向此InteneService发送意图也将开始工作,但在安装应用程序并发送IntentService时不调用任何活动通话失败。我知道Google在Android 9中添加了更多限制,但我不知道我现在缺少哪一个。有人可以给我提示。

3 个答案:

答案 0 :(得分:3)

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

还要添加它。

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

设置

  

android:usesCleartextTraffic =“ true”

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

<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">

请查看此官方博客,了解发生这种情况的原因,我们必须添加清单文件。

答案 1 :(得分:0)

您是否尝试在API 26或更高版本上运行该应用程序(我知道您已经测试过API 28),但是根据官方android文档,

  

Android 8.0限制了用户无法使用应用程序时的功能   直接与他们互动。应用有两种限制方式:

     

后台服务限制:当应用处于空闲状态时,存在一些限制   使用后台服务。这不适用于前台   服务,对用户来说更明显。

     

广播限制:只有少数例外,应用无法使用其   清单以注册隐式广播。他们仍然可以注册   在运行时进行这些广播,他们可以使用清单来   注册专门针对其应用的露骨广播。

     

注意:默认情况下,这些限制仅适用于定位到   Android 8.0(API级别26)或更高版本。但是,用户可以启用大多数   在“设置”屏幕上对任何应用程序的限制,即使   该应用的目标API级别低于26。

也许可以按照文档解决您的问题

  

在大多数情况下,应用可以通过使用以下方法来解决这些限制   JobScheduler职位。这种方法可以让应用安排执行工作   当应用未积极运行但仍为系统提供   在不影响用户的情况下安排这些作业的时间   经验。 Android 8.0对JobScheduler进行了多项改进   这样可以更轻松地替换服务和广播接收器   预定的工作;有关更多信息,请参见JobScheduler的改进。

答案 2 :(得分:0)

添加:主要androidManifest.xml中的android:usesCleartextTraffic="true"对我有用,如下所示:

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:roundIcon="@mipmap/ic_launcher_round"
  android:allowBackup="false"
  android:theme="@style/AppTheme"
  android:usesCleartextTraffic="true"
  >
  <activity {....}