将设备更新到 Android Pie 9.0 后未加载视图

Views not loading after updating device to Android Pie 9.0

我最近将 phone 更新为 Android 9.0。我正在开发的应用程序在早期 Android 版本中运行良好。但在更新后,一些需要互联网的视图无法加载。空格显示在它们的位置。

它有一个 ViewPager 作为横幅,在类别和交易下方分别有 2 个 RecyclerView。它们都需要互联网来加载数据。

我不知道 Android Pie 是否需要任何额外的权限或依赖项。

日志显示

NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

为了增强用户隐私,Android9 引入了多项行为更改,例如限制后台应用程序对设备传感器的访问、限制从 Wi-Fi 扫描中检索的信息以及与以下内容相关的新权限规则和权限组phone 次通话、phone 次状态和 Wi-Fi 扫描。

这些更改会影响 Android 9 上的所有应用 运行,无论目标 SDK 版本如何。

android:usesCleartextTraffic

表明应用是否打算使用明文网络流量,例如明文 HTTP。默认值为 "true"。 当该属性设置为 "false" 时,平台组件(例如,HTTP 和 FTP 堆栈、DownloadManager、MediaPlayer)将拒绝应用程序使用明文流量的请求。强烈建议第三方图书馆也遵守此设置。避免明文流量的关键原因是缺乏机密性、真实性和防篡改保护:网络攻击者可以窃听传输的数据并在不被发现的情况下修改它。

这个标志是在尽力而为的基础上得到尊重的,因为在给定提供给它们的访问级别的情况下,不可能阻止来自 Android 应用程序的所有明文流量。例如,不期望 Socket API 会遵守此标志,因为它无法确定其流量是否为明文。但是,来自应用程序的大多数网络流量都由更高级别的网络 stacks/components 处理,它可以通过从 ApplicationInfo.flags 或 NetworkSecurityPolicy.isCleartextTrafficPermitted().

读取它来遵守此标志。

我认为唯一可能的错误是。在 Android 9 之后你需要指定 networksecurityconfig 来连接服务器 url 。因此,您需要对代码进行以下更改。

在您的 AndroidManifest.xml 的应用程序标签中添加 android:networkSecurityConfig="@xml/network_security_config" 像这样

<application
        android:name=".ApplicationClass"
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

其中 network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

您需要在 res 目录下创建 xml 目录,然后在 xml 文件夹中创建 network_security_config.xml

尝试这些解决方案

Solution 1)

manifest 文件的应用程序标签中添加这一行

android:usesCleartextTraffic="true"

喜欢下面

<application
            android:name=".ApplicationClass"
            android:usesCleartextTraffic="true"
            android:networkSecurityConfig="@xml/network_security_config"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">

manifest 文件的应用程序标签中添加此标签

Solution 2)

在应用标签中添加android:networkSecurityConfig="@xml/network_security_config"

<application
        android:name=".ApplicationClass"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

其中 network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

在res目录下创建xml然后在xml文件夹下创建network_security_config.xml

更多信息

https://developer.android.com/about/versions/pie/android-9.0-changes-28