将设备更新到 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
我最近将 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