我有一个可以在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中添加了更多限制,但我不知道我现在缺少哪一个。有人可以给我提示。
答案 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 {....}